Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式:捕获多个正则表达式组合的否定_Java_Regex_Regex Lookarounds_Regex Negation_Regex Group - Fatal编程技术网

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

Java 正则表达式:捕获多个正则表达式组合的否定,java,regex,regex-lookarounds,regex-negation,regex-group,Java,Regex,Regex Lookarounds,Regex Negation,Regex Group,我有一个较大的正则表达式,它由较小的正则表达式组合而成,我试图对这些正则表达式求反,以捕获不在正则表达式中的字符(例如~、`、@、#、$、%、^、&) 我尝试为我的错误案例编写正则表达式,但什么也找不到。也许这是因为正则表达式的顺序?此外,“!=”被视为特殊符号,而“!”被视为错误。我试图用消极的前瞻来解释这一点(没有用) 。。。 字符串关键字=“\\b(?:else | if | int | return | void | while)\\b”; 字符串标识符=“\\b[a-zA-Z]+\\b

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

我尝试为我的错误案例编写正则表达式,但什么也找不到。也许这是因为正则表达式的顺序?此外,“!=”被视为特殊符号,而“!”被视为错误。我试图用消极的前瞻来解释这一点(没有用)

。。。
字符串关键字=“\\b(?:else | if | int | return | void | while)\\b”;
字符串标识符=“\\b[a-zA-Z]+\\b”;
字符串编号=“\\b[\\d]+\\b”;
字符串特殊符号=(=)(!=)(=)(=)(\\+)(\\-)(\\*)(\\*)(\\/)(\\)(\\)(\\)(\=)(\\)(\\)(\\)(\\)(\\,)(\\()(\+)(\\)(\\[)(\\)(\\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\\)(\)(\\)(\\)(\\)(\\)(\\)(\))(\\)(\)(\)(\;
字符串错误=“[`~@$%^&]|(!(?!(=))”;
字符串regex=“(“+关键字+”)|(“+标识符+”)|(“+数字+”)|(“+特殊符号+”)|(“+错误+”)”);
Pattern=Pattern.compile(regex);
for(Matcher Matcher=pattern.Matcher(str);Matcher.find();){
如果(匹配器启动(1)!=-1){
System.out.println(“关键字:+matcher.group());
}否则如果(匹配器启动(2)!=-1){
System.out.println(“ID:+matcher.group());
}否则如果(匹配器启动(3)!=-1){
System.out.println(“NUM:+matcher.group());
}否则如果(匹配器启动(4)!=-1){
System.out.println(matcher.group());
}否则如果(匹配器启动(5)!=-1){
System.out.println(“错误:+matcher.group());
}
}//为了
...
预期产出:
输入:iiii=3@33;
身份证号码:iiii
=
总数:3
错误:@33
;
实际产量:
输入:iiii=3@33;
身份证号码:iiii
=
总数:3
总数:33
;
预期产出:
输入:否则返回gcd(VxxxxxVVVV,u-u/v*v);
关键词:else
ID:ret
错误:\u urn
ID:gcd
(
ID:VXxxxxxVVVV
,
ID:u
-
ID:u
/
身份证号码:v
*
身份证号码:v
)
;
实际产量:
输入:否则返回gcd(VxxxxxVVVV,u-u/v*v);
关键词:else
ID:gcd
(
ID:VXxxxxxVVVV
,
ID:u
-
ID:u
/
身份证号码:v
*
身份证号码:v
)
;
预期产出:
输入:!
错误:!
实际产量:
输入:!
(本应为错误,但未捕获任何内容)

关键字
标识符
编号
不定义任何捕获组,因此
正则表达式
关键字
定义为组1,
标识符
定义为组2,
编号
定义为组3,
特殊符号
定义为组4

然而,由于
特殊符号
定义了许多捕获组,所以组5是
(==)
。它不是
regex
中的第五个
()
。由于
特殊符号
中有20个捕获组,这意味着
错误
是组25,但不要使用该组(未来的更改太容易出错)

特殊符号中删除所有捕获组

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

如果能看到一些输入是通过还是失败,那就太好了。即使是正则表达式输出,因为Java不在我的机器上运行。@sln超过“…”的所有内容都是输入示例。您需要更多输入示例吗?您希望
(!(?!(=))
做什么?A
后面不跟
=
?为什么?
(NOT)运算符应该是有效的“特殊符号”,不是吗?--无论如何,这两个不必要的捕获组太长了,所以只需使用
!(?!=)
对于
error
来说,仅仅获取一个非空白字符,而该字符尚未与前面的表达式匹配,不是更容易吗?如
error=“\\S”
Wow中所示。我不知道捕获组会导致这么多问题,下次我一定会尽量少使用它们。还有,是的。“\\S+”是错误和令牌的其余部分。非常感谢!再次感谢!
String special_symbol = "==|!=|<=|>=|\\+|\\-|\\*|\\/|\\<|\\>|\\=|\\;|\\,|\\(|\\)|\\[|\\]|\\{|\\)|\\,";
String special_symbol = "==|!=|<=|>=|[+\\-*/<>=;,()\\[\\]{}]";