【问题标题】:Matcher returns matches on a regex pattern, but split() fails to find a match on the same regex?Matcher 返回正则表达式模式的匹配项,但 split() 无法在同一个正则表达式上找到匹配项?
【发布时间】:2010-01-31 02:09:21
【问题描述】:

我看不出 Matcher 会在模式上返回匹配项的原因,但 split 会在相同的正则表达式模式上返回零长度数组。它应该返回一些东西——在这个例子中,我正在寻找包含“param/value”的 2 个单独字符串的返回。

public class MyClass {

    protected Pattern regEx = "(([a-z])+/{1}([a-z0-9])+/?)*";

    public void someMethod() {
        String qs = "param/value/param/value";
        Matcher matcherParamsRegEx = this.regEx.matcher(qs);
        if (matcherParamsRegEx.matches()) { // This finds a match.
            String[] parameterValues = qs.split(this.regEx.pattern()); // No matches... zero length array.
        }
    }
}

【问题讨论】:

    标签: java regex


    【解决方案1】:

    模式可以匹配整个字符串。 split() 不返回匹配项,只返回两者之间的内容。因为模式匹配整个字符串,只留下一个空字符串返回。我想你可能对split() 的作用有误解。

    例如:

    String qs = "param/value/param/value";
    String pieces = qs.split("/"); 
    

    将返回一个包含 4 个元素的数组:param、value、param、value。

    请注意,您搜索的内容 ("/") 不会返回。

    您的正则表达式有些过于复杂。一方面,您使用的是{1},这是不必要的。其次,当您执行([a-z])+ 时,您将准确捕获后者(遇到的最后一个。与([a-z]+) 相比,它将捕获整个匹配项。此外,您甚至不需要为此捕获。模式可以简化为:

    protected Pattern regEx = Pattern.compile("[a-z]+/([a-z0-9]+/?)*");
    

    技术上是这样的:

    protected Pattern regEx = "(([a-z])+/{1}([a-z0-9])+/?)*";
    

    是一个编译器错误,因此您实际运行的内容与您发布的内容可能不同。

    【讨论】:

      【解决方案2】:

      这里的问题是split 拆分了您的正则表达式的围绕 个匹配项。您有两场连续的比赛,中间没有其他比赛,所以split 没有任何东西可以返回。

      我看不出有任何方法可以让您使用split 从该字符串中获取您想要的内容,但是如果您可以使用不同的分隔符来分隔对而不是分隔名称和值,这将有很大帮助.

      否则,您可能会在斜杠上拆分并将交替的结果作为名称和值,但这很容易出错。

      【讨论】:

        【解决方案3】:

        正则表达式 is 匹配——如果不是,您将得到一个单元素数组,该元素是整个原始字符串。你只是对split() 的工作原理有错误的想法。在第一次匹配尝试时,它会找到“param/value/”并将匹配之前的所有内容存储为第一个标记:一个空字符串。第二次尝试找到“param/value”并将其与第一个匹配项之间的任何内容存储为下一个标记:另一个空字符串。第三次匹配尝试失败,因此第二次匹配和字符串末尾之间的任何内容都将成为最终标记:又是一个空字符串。

        存储所有标记后,split() 反向遍历它们,检查尾随的空标记。第三个令牌确实是空的,所以它会删除那个。第二个也是空的,所以它会删除那个。你知道这是怎么回事吗?您可以强制split() 通过传递一个负整数作为第二个参数来保留尾随的空匹配项,但这显然对您没有任何好处。您需要根据 regex 包的实际工作方式重新考虑您的问题(无论是什么问题)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-12
          • 1970-01-01
          • 1970-01-01
          • 2010-10-05
          • 1970-01-01
          相关资源
          最近更新 更多