正则表达式:捕获多个正则表达式组合的否定
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)
keyword
、identifier
和 number
没有定义任何捕获组,因此 regex
将 keyword
定义为组 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 = "==|!=|<=|>=|[+\-*/<>=;,()\[\]{}]";
我有一个由较小的正则表达式组合而成的大型正则表达式,我试图取反以捕获不在正则表达式中的字符(例如 ~、`、@、#、$、%、^、& ).
我尝试为我的错误情况编写一个正则表达式,但没有找到任何东西。也许这是因为正则表达式的顺序?此外,“!=”被认为是特殊符号,而“!”被认为是一个错误。我尝试使用负前瞻来解决这个问题(无济于事)。
...
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)
keyword
、identifier
和 number
没有定义任何捕获组,因此 regex
将 keyword
定义为组 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 = "==|!=|<=|>=|[+\-*/<>=;,()\[\]{}]";