更新
由于@dasblinkenlight和所有其他优秀的撒玛利亚人,我找到了解决方案。 工作代码适用于任何有类似问题的人:
Pattern pattern = Pattern.compile("(\\d\\+)(\\s)([\\+\\-\\*\\%\\^])(\\s)([\\d\\+)");
Matcher matchOp1 = pattern.matcher("1 + 1");
System.out.println(matchOp1.group(1));
这只会打印第一组。
原始问题:
首先,我不能使用任何if语句,因此我必须只捕获和处理异常。
假设我有一个包含" 10 + 20"。
的字符串我有以下正则表达式:"(\ d \ +)(\ s)([\ + \ - \ * \%\ ^])(\ s)([\ d \ +]&# 34 ;. 此正则表达式旨在匹配(任意长度的整数)(空格)(运算符)(空格)(任意长度的整数)
File Not redable error.
我想要打印" 10"只有匹配,但这会抛出PatternSyntaxException。有人能给我一些见解吗?
谢谢!
答案 0 :(得分:3)
你的模式中有一个额外的[
,你逃脱了你不应该拥有的地方:
Pattern pattern = Pattern.compile("(\\d\\+)(\\s)([\\+\\-\\*\\%\\^])(\\s)([\\d\\+)");
// ^^ ^ ^^
删除这些将解决问题。
请注意,在字符类[...]
中转义元字符不是必需的:只需小心移动-
到其中一个端点,并将^
放在除第一个以外的任何位置:
"(\\d+)(\\s)([-+*%/^])(\\s)(\\d+)"
请注意,所有这些不必要的反斜杠都会忘记分割符号。
答案 1 :(得分:2)
您的正则表达式中存在一些问题
Pattern pattern = Pattern.compile("(\\d\\+)(\\s)([\\+\\-\\*\\%\\^])(\\s)([\\d\\+)");
^ ^ ^
+
,因为它表示超过1位,而不是字面+
。IllegalStateException
,因此您必须在捕获组之前放置if(matchOp1.find())
。相反,它应该是:
(\d+)(\s)([\+\-\*\%\^])(\s)(\d+)
在代码中使用时:
Pattern pattern = Pattern.compile("(\\d+)(\\s)([\\+\\-\\*\\%\\^])(\\s)(\\d+)");
Matcher matchOp1 = pattern.matcher("1 + 1");
if(matchOp1.find())
System.out.println(matchOp1.group(1));