【问题标题】:How to use Android REGEX with Pattern and Matcher Classes?如何将 Android REGEX 与 Pattern 和 Matcher 类一起使用?
【发布时间】:2012-03-24 01:24:49
【问题描述】:

我有以下代码:

String example = "<!--§FILES_SECTION§\n" +
                "Example line one\n" +
                "Example line two\n" +
                "§FILES_SECTION§-->";

        String myPattern = ".*?FILES_SECTION.*?\n(.*?)\n.*?FILES_SECTION.*?";
        Pattern p = Pattern.compile(myPattern);
        Matcher m = p.matcher(example);

        if ( m.matches() )
            Log.d("Matcher", "PATTERN MATCHES!");
        else
            Log.d("MATCHER", "PATTERN DOES NOT MATCH!");

为什么总是返回“PATTERN DOES NOT MATCH”?

【问题讨论】:

标签: java android regex matcher


【解决方案1】:

默认情况下,.不匹配换行符。您需要添加一个正则表达式选项才能做到这一点:

Pattern p = Pattern.compile(myPattern,Pattern.DOTALL);

【讨论】:

    【解决方案2】:

    m.matches() 仅在整个字符串匹配时才返回 true。改用 m.find() 应该会更好!

    【讨论】:

    • 但是整个字符串不应该匹配正则表达式吗?我觉得应该!无论如何,我尝试过使用 while (m.find),它甚至没有循环一次,所以我认为这是一个不同的问题!
    • 也许我有点不清楚。 matches() 在模式的开头和结尾隐式添加“^”和“$”,因此您的字符串将不匹配,因为它以“”结尾。也许 find() 和 arc 的解决方案的组合会起作用?编辑:对不起,我读错了你的模式。就像 Caner 说的那样,它看起来有点不对劲。
    【解决方案3】:

    首先,正如 arc 所说,.除非您激活 Pattern.DOTALL,否则不会匹配到 \n,并且作为 Petter M,您应该使用 m.find(),否则它不会匹配。

    然后,如果由于某种原因无法使用 Pattern.DOTALL,则可以使用其他表达式。

    FILES_SECTION(?:.|\s)*FILES_SECTION

    (请注意,我对 FILES_SECTION 分隔符之间的字符使用了非捕获组)。

    【讨论】:

    • 感谢您提供详细信息 :-)
    • 另外,您可以将表达式与 match() 一起使用,启用 Pattern.DOTALL 并删除所有 ?表达式中的字符。还记得一个吗?匹配 a 0 到 1 次,a* 匹配 a 0 到 n 次……所以写类似 a*?有点没有实际意义。这样,您自己的表达式可以简化为:“.*FILES_SECTION.*FILES_SECTION.*”,前提是您使用 Pattern.DOTALL。无论如何,我认为这种表达方式可能过于宽泛。 :)
    • 另一种可以避免 DOTALL 的方法是使用这个字符类: [\d\D]+ 这将匹配任何数字或非数字......即任何东西
    猜你喜欢
    • 2021-01-26
    • 2021-02-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    相关资源
    最近更新 更多