正则表达式:捕获多个正则表达式组合的否定

Regular Expression: Capture Negation of Combination of Multiple Regular Expressions

我有一个由较小的正则表达式组合而成的大型正则表达式,我试图取反以捕获不在正则表达式中的字符(例如 ~、`、@、#、$、%、^、& ).

我尝试为我的错误情况编写一个正则表达式,但没有找到任何东西。也许这是因为正则表达式的顺序?此外,“!=”被认为是特殊符号,而“!”被认为是一个错误。我尝试使用负前瞻来解决这个问题(无济于事)。

...
String keyword = "\b(?:else|if|int|return|void|while)\b";
String identifier = "\b[a-zA-Z]+\b";
String number = "\b[\d]+\b";
String special_symbol = "(==)|(!=)|(<=)|(>=)|(\+)|(\-)|(\*)|(\/)|(\<)|(\>)|(\=)|(\;)|(\,)|(\()|(\))|(\[)|(\])|(\{)|(\})|(\,)";
String error = "[_`~@#$%^&]|(!(?!(=)))";
String regex = "(" + keyword + ")|(" + identifier + ")|(" + number + ")|(" + special_symbol + ")|(" + error + ")";

Pattern pattern = Pattern.compile(regex);

for( Matcher matcher = pattern.matcher(str); matcher.find(); ) {
   if ( matcher.start(1) != -1 ) {
      System.out.println("Keyword: " + matcher.group() );
   } else if ( matcher.start(2) != -1 ) {
      System.out.println("ID: " + matcher.group() );
   } else if ( matcher.start(3) != -1 ) {
      System.out.println("NUM: " + matcher.group());
   } else if ( matcher.start(4) != -1 ) {
      System.out.println( matcher.group() );
   } else if ( matcher.start(5) != -1 ) {
      System.out.println("ERROR: " + matcher.group() );
   }
} // for
...

Expected Output:
INPUT: iiii = 3@33;
ID: iiii 
=
NUM: 3
Error: @33
;

Actual Output:
INPUT: iiii = 3@33;
ID: iiii
=
NUM: 3
NUM: 33
;

Expected Output:
INPUT: else ret_urn gcd(vxxxxxxvvvvv, u-u/v*v);
keyword: else
ID: ret
Error: _urn
ID: gcd
(
ID: vxxxxxxvvvvv
,
ID: u
-
ID: u
/
ID: v
*
ID: v
)
;

Actual Output:
INPUT: else ret_urn gcd(vxxxxxxvvvvv, u-u/v*v);
Keyword: else
ID: gcd
(
ID: vxxxxxxvvvvv
,
ID: u
-
ID: u
/
ID: v
*
ID: v
)
;

Expected Output:
INPUT: !
Error: !

Actual Output:
INPUT: !
(This is supposed to be an error, but nothing is captured)

keywordidentifiernumber 没有定义任何捕获组,因此 regexkeyword 定义为组 1,identifier 作为第 2 组,number 作为第 3 组,special_symbol 作为第 4 组。

但是,因为special_symbol定义了很多捕获组,第5组是(==)。它不是 regex 中的第 5 个 ()。由于 special_symbol 中有 20 个捕获组,这意味着 error 是第 25 组,但不要使用它(将来更改时容易出错)。

special_symbol 中删除所有捕获组:

String special_symbol = "==|!=|<=|>=|\+|\-|\*|\/|\<|\>|\=|\;|\,|\(|\)|\[|\]|\{|\)|\,";

哦,糟糕,你有两次 \,\),没有 \}.

此外,所有那些单一的特殊字符都应该在字符 class 中,而不是在大的 OR 序列中:

String special_symbol = "==|!=|<=|>=|[+\-*/<>=;,()\[\]{}]";