我有这个java正则表达式\ matcher:
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("^RC,([\\d]+),(.*)$");
和这段代码:
private Iterable<ClientCommand> tryToDeserializeNonProtocolBufferContent(byte[] content) {
String body = "RC,200,OK\nBridgeToRes,UPDATEPROFILE,916,0";
Matcher rcCommandMatcher = RC_COMMAND_PATTERN.matcher(body);
if (!rcCommandMatcher.find()) {
throw new IllegalArgumentException();
}
...
}
但我看到执行达到rcCommandMatcher.find() == false
为什么我的匹配器失败了?
答案 0 :(得分:1)
问题是默认情况下,点不能与换行符匹配。
要做到这一点,你需要使用s修饰符(或DOTALL标志),例如:
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("^RC,([\\d]+),(?s)(.*)$");
或
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("^RC,([\\d]+),(.*)$", Pattern.DOTALL);
您的模式可以这样写:
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("\\ARC,(\\d+),(.*)\\z", Pattern.DOTALL);
(\d
周围的括号无用,因为\d
已经是一个字符类。使用\A
和\z
代替^
并且$
不那么暧昧,因为\A
和\z
的含义不会改变任何模式(mulitiline或不是))