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)
打印失败.
为什么会发生这种情况,如何使模式忽略空格?
你身边有一个误解.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)