我的正则表达式中缺少什么?

时间:2014-11-30 12:11:07

标签: 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\nBridgeToRes,UPDATEPROFILE,916,0";
        Matcher rcCommandMatcher = RC_COMMAND_PATTERN.matcher(body);
        if (!rcCommandMatcher.find()) {
            throw new IllegalArgumentException();
        }
...    
    }

但我看到执行达到rcCommandMatcher.find() == false

为什么我的匹配器失败了?

1 个答案:

答案 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或不是))