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

gsi*_*011 2 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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,我想要空白无关紧要,所以下面也应该打印成功.

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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

所述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.");
    }
}
Run Code Online (Sandbox Code Playgroud)

打印失败.

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

ste*_*ema 9

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

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

有了Pattern.COMMENTS你可以把空白在您的正则表达式这样

String regex = "\\{ user_id: [0-9]+ \\}";
Run Code Online (Sandbox Code Playgroud)

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

String string = "{user_id : 0}";
Run Code Online (Sandbox Code Playgroud)

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

String regex = "\\{ user_id\\ :\\  [0-9]+ \\}";
Run Code Online (Sandbox Code Playgroud)

或者您使用空白类

String regex = "\\{ user_id \\s:\\s [0-9]+ \\}";
Run Code Online (Sandbox Code Playgroud)