如何在java中正确使用模式匹配

时间:2017-03-22 06:20:30

标签: java regex

更新

由于@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。有人能给我一些见解吗?

谢谢!

2 个答案:

答案 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. 您尚未关闭方括号
  2. 你不应该逃避+,因为它表示超过1位,而不是字面+
  3. 它将抛出IllegalStateException,因此您必须在捕获组之前放置if(matchOp1.find())
  4. 相反,它应该是:

    (\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));
    

    DEMO