Pattern.COMMENTS总是导致Matcher.find失败

时间:2012-02-03 06:44:00

标签: java regex whitespace string-matching

以下代码匹配两个表达式并打印成功。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id : [0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

但是,我希望空白无关紧要,因此以下内容也应该打印成功。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id:[0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

Pattern.COMMENTS标志应该允许空格,但会导致无法打印。如果字符串完全等效,包括空格,它甚至会导致打印失败,如第一个示例中所示。例如,

import java.util.regex.Matcher;     import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {

        String regex = "\\{user_id : [0-9]+\\}";
        String string = "{user_id : 0}";

        Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
        Matcher matcher = pattern.matcher(string);

        if (matcher.find())
            System.out.println("Success.");
        else
            System.out.println("Failure.");
    }
}

打印失败。

为什么会发生这种情况?如何使模式忽略空格?

1 个答案:

答案 0 :(得分:9)

你身边存在误解。 Pattern.COMMENTS允许你在你的正则表达式中添加额外的空格,以提高正则表达式的可读性,但是这个空格不会在字符串中匹配。

这不允许字符串中的空格,然后自动匹配,而不在正则表达式中定义。

示例

使用Pattern.COMMENTS,你可以在你的正则表达式中添加空格

String regex = "\\{ user_id: [0-9]+ \\}";

改善readablitiy,但它不匹配字符串

String string = "{user_id : 0}";

因为你没有在字符串中定义空格,所以如果你想使用Pattern.COMMENTS那么你需要特别处理你想要匹配的空格,要么你要逃避它

String regex = "\\{ user_id\\ :\\  [0-9]+ \\}";

或者您使用空白类

String regex = "\\{ user_id \\s:\\s [0-9]+ \\}";