Java正则表达式匹配器可以正常工作,但是String.split()方法无法正常工作。

3
我想使用一行String.split()从我正在编写的查询中提取出“name”。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
`

4
您的匹配覆盖了整个字符串。因此,如果您按照匹配项进行“split”操作,则会得到两个空字符串。默认情况下,尾随的空字符串将被忽略。如果您需要获取这些空字符串,请使用带有整数参数的[重载](http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#split(java.lang.String, int))并提供一个负整数。在Java中,“split”不会返回与分割项一起匹配的组(就像其他一些语言中那样)。 - Martin Ender
2
正则表达式 [\\S\\s] 太疯狂了 - 它的意思是“任何空格或非空格字符”。它和 . 一样。 - Bohemian
谢谢Bohemian提供的意见。我本来是从“.”开始的,然后忘记放回去了。 - Thomas Beauvais
只有在使用dotall修饰符的情况下才能使用@Bohemian。 - Martin Ender
@m.buettner 好的,没问题。 - Bohemian
5个回答

2
你的正则表达式匹配整个字符串。因此,在拆分时,整个字符串会被删除。这与 "a".split("a") 完全相同,它返回一个空数组。
你可以使用以下方法代替:
queryText.replaceAll(".*name <equals> `([^`]+)`.*", "$1")

这个函数返回一些名称


0

尝试使用正则表达式

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

由于这将使您从中获得结果“某个名称

id <equals> `1` <AND> name <equals> `some name`

或者如果“某个名称”不总是出现在末尾,您可以使用

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

以相同的结果


0
你的正则表达式覆盖了整个字符串。尝试移除 "^" 和 "$"。 Split 方法需要移除表达式,而不是必须找到以检测特定子字符串的表达式。

0

感谢大家的帮助。[m.buettner]是对的,我只是误解了String.split()方法的用途。根据Java文档...

此方法的工作方式就好像使用给定表达式和限制参数为零调用两个参数拆分方法一样。因此,尾随的空字符串不包含在结果数组中。

这并不是我想要的。 我将使用我的Pattern + Matcher创建一个util方法。

再次感谢大家。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接