gpt4 book ai didi

java - 正则表达式: Capture Negation of Combination of Multiple Regular Expressions

转载 作者:行者123 更新时间:2023-12-02 09:33:59 25 4
gpt4 key购买 nike

我有一个由较小的正则表达式组合而成的大型正则表达式,我试图对其进行否定,以便捕获不在正则表达式中的字符(例如 ~、`、@、#、$、%、^、&)。

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

...
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 未定义任何捕获组,因此 regex 定义 keyword 作为组 1,identifier 作为组 2,number 作为组 3,special_symbol 作为组 4。

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

special_symbol 中删除所有捕获组:

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

哦,哎呀,你有两次 \\,\\),却没有 \\}

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

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

关于java - 正则表达式: Capture Negation of Combination of Multiple Regular Expressions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com