aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2013-11-10 11:07:20 +1000
committerSteve Bennett <steveb@workware.net.au>2016-02-02 12:48:14 +1000
commit1ea06e8f2b15842aa68f2648b7ba70ab1038cf83 (patch)
treede83536b167d10785ccce054e2ae656701551ab4
parent7d0ac6440939ca38cf2f7be89c856f76b0fb9f9a (diff)
downloadjimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.zip
jimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.tar.gz
jimtcl-1ea06e8f2b15842aa68f2648b7ba70ab1038cf83.tar.bz2
regexp: add support for \D, \W and \S
These are the negated versions of \d, \w and \s Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r--jimregexp.c14
-rw-r--r--tests/regexp.test3
2 files changed, 12 insertions, 5 deletions
diff --git a/jimregexp.c b/jimregexp.c
index f1b7cd3..e3f7a22 100644
--- a/jimregexp.c
+++ b/jimregexp.c
@@ -797,7 +797,8 @@ static int regatom(regex_t *preg, int *flagp)
preg->err = REG_ERR_COUNT_FOLLOWS_NOTHING;
return 0;
case '\\':
- switch (*preg->regparse++) {
+ ch = *preg->regparse++;
+ switch (ch) {
case '\0':
preg->err = REG_ERR_TRAILING_BACKSLASH;
return 0;
@@ -810,13 +811,15 @@ static int regatom(regex_t *preg, int *flagp)
ret = regnode(preg, WORDZ);
break;
case 'd':
- ret = regnode(preg, ANYOF);
+ case 'D':
+ ret = regnode(preg, ch == 'd' ? ANYOF : ANYBUT);
reg_addrange(preg, '0', '9');
regc(preg, '\0');
*flagp |= HASWIDTH|SIMPLE;
break;
case 'w':
- ret = regnode(preg, ANYOF);
+ case 'W':
+ ret = regnode(preg, ch == 'w' ? ANYOF : ANYBUT);
if ((preg->cflags & REG_ICASE) == 0) {
reg_addrange(preg, 'a', 'z');
}
@@ -827,7 +830,8 @@ static int regatom(regex_t *preg, int *flagp)
*flagp |= HASWIDTH|SIMPLE;
break;
case 's':
- ret = regnode(preg, ANYOF);
+ case 'S':
+ ret = regnode(preg, ch == 's' ? ANYOF : ANYBUT);
reg_addrange_str(preg," \t\r\n\f\v");
regc(preg, '\0');
*flagp |= HASWIDTH|SIMPLE;
@@ -865,7 +869,7 @@ static int regatom(regex_t *preg, int *flagp)
/* Non-trailing backslash.
* Is this a special escape, or a regular escape?
*/
- if (strchr("<>mMwds", preg->regparse[n])) {
+ if (strchr("<>mMwWdDsS", preg->regparse[n])) {
/* A special escape. All done with EXACTLY */
break;
}
diff --git a/tests/regexp.test b/tests/regexp.test
index a4e3f73..57b4dd0 100644
--- a/tests/regexp.test
+++ b/tests/regexp.test
@@ -519,6 +519,9 @@ test regexp-17.6 {regexp -inline no matches} {
test regexp-17.7 {regexp -inline, no matchvars allowed} {
list [catch {regexp -inline b abc match} msg] $msg
} {1 {regexp match variables not allowed when using -inline}}
+test regexp-17.8 {\W, \S and \D} regexp_are {
+ regexp -inline {(\W+)(\D+)(\S+)} " #!word abc 13123 "
+} {{ #!word abc 13123} { #!} {word abc } 13123}
test regexp-18.1 {regexp -all} {
regexp -all b bbbbb