【问题标题】:Java Regex Matcher works, but String.split() doesn'tJava Regex Matcher 有效,但 String.split() 无效
【发布时间】:2013-08-21 02:50:00
【问题描述】:

我希望使用单行 String.split() 来提取我正在编写的查询中的“名称”..

Pattern + Matcher 的工作方式与预期一样,但我正在努力弄清楚为什么 String.split() 不返回匹配项!

public static void main(String[] asdf)
{
    final String queryText = "id <equals> `1` <AND> name <equals> `some name`";
    final String regex = "^(.*name <equals> `)([\\S\\s]*)(`.*)$";

    System.out.println("Splitting...");
    final String[] split = queryText.split(regex);
    for (int i = 0; i < split.length; i++)
    {
        System.out.println(split[i]);
    }

    System.out.println("Matching...");
    final Pattern pattern = Pattern.compile(regex);
    final Matcher matcher = pattern.matcher(queryText);

    if (matcher.find())
    {
        for (int i = 0; i < matcher.groupCount(); i++)
        {
            System.out.println(matcher.group(i + 1));
        }
    }
}

打印输出

Splitting...
Matching...
id <equals> `1` <AND> name <equals> `
some name
`

【问题讨论】:

  • 你的匹配覆盖了整个字符串。因此,如果您 split 匹配,则两个结果字符串为空。默认情况下会省略尾随的空字符串。使用 [overload with an integer argument](docs.oracle.com/javase/1.4.2/docs/api/java/lang/…, int)) 并提供一个负整数来获取空字符串,如果这是你想要的。在 Java 中,split 不返回除了拆分之外的匹配组(因为它适用于其他一些语言)。
  • 正则表达式[\\S\\s] 太疯狂了——它的意思是“任何字符是空格还是非空格。它与. 相同
  • 感谢波西米亚人的输入。我从 . 开始,忘了把它放回去。
  • @Bohemian 只能与 dotall 修饰符结合使用。
  • @m.buettner 够公平

标签: java regex


【解决方案1】:

您的正则表达式匹配整个字符串。因此,在拆分时,整个字符串都会被删除。和"a".split("a")完全一样,返回一个空数组。

你可以改用的是:

queryText.replaceAll(".*name <equals> `([^`]+)`.*", "$1")

返回some name

【讨论】:

    【解决方案2】:

    您的正则表达式涵盖了所有字符串。尝试删除“^”和“$”。 拆分方法希望表达式删除而不是必须找到的表达式来检测特定的子字符串。

    【讨论】:

      【解决方案3】:

      您的正则表达式变量的格式不适合 String split() 方法...尝试打破正则表达式,如该线程的答案所示...

      java - split string using regular expression

      【讨论】:

        【解决方案4】:

        尝试使用正则表达式

        ((?<=`)[^`]*(?=`$))
        

        因为这会为您提供来自

        的结果“some name
        id <equals> `1` <AND> name <equals> `some name`
        

        或者如果“some name”不总是出现在最后你可以使用

        ((?<=name <equals> `)[^`]*(?=`))
        

        结果相同

        【讨论】:

          【解决方案5】:

          感谢您的所有意见。 [m.buettner] 是正确的。我只是误解了String.split() 应该做什么。根据 Java 文档..

          这个方法的工作方式就像是通过调用两个参数的 split 方法 给定的表达式和零的极限参数。尾随空 因此字符串不包含在结果数组中。

          这不是我想要的。我只会用我的 Pattern + Matcher 创建一个 util 方法。

          再次感谢大家。

          【讨论】:

            猜你喜欢
            • 2016-01-12
            • 2013-04-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-08
            • 1970-01-01
            • 2014-03-03
            相关资源
            最近更新 更多