Java 我的正则表达式缺少什么来匹配?
我有一个java正则表达式\matcher:Java 我的正则表达式缺少什么来匹配?,java,regex,Java,Regex,我有一个java正则表达式\matcher: private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("^RC,([\\d]+),(.*)$"); 该代码: private Iterable<ClientCommand> tryToDeserializeNonProtocolBufferContent(byte[] content) { String body = "RC,200,OK
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();
}
...
}
private Iterable tryToDeserializeNonProtocolBufferContent(字节[]内容){
String body=“RC,200,确定\nBridgeToRes,UPDATEPROFILE,916,0”;
Matcher rcCommandMatcher=RC_COMMAND_PATTERN.Matcher(body);
如果(!rcCommandMatcher.find()){
抛出新的IllegalArgumentException();
}
...
}
但是我看到执行达到了rcCommandMatcher.find()==false
为什么我的匹配器失败了?问题是默认情况下点无法匹配换行符 为此,您需要使用s修饰符(或DOTALL标志),例如:
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("^RC,([\\d]+),(?s)(.*)$");
或
您的模式可以这样写:
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("\\ARC,(\\d+),(.*)\\z", Pattern.DOTALL);
(由于
\d
已经是一个字符类,因此\d
周围的括号是无用的。\a
和\z
代替^
和$
的使用不太含糊,因为\a
和\z
的含义不会改变任何模式(多行与否))什么是(*)
表示没有此标志?捕获除换行符以外的任何字符,零次或多次。@EladBenda:The
表示除换行符以外的任何字符\n
模式。DOTALL
没有帮助。还不是match@EladBenda:问题不在于本例中的模式,而在于代码中的其他地方。您可以在这里看到一个工作演示:(单击Java按钮)
private static final Pattern RC_COMMAND_PATTERN = Pattern.compile("\\ARC,(\\d+),(.*)\\z", Pattern.DOTALL);