3

我正在寻找使用一行 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
`
4

5 回答 5

2

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

您可以使用的是:

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

返回some name

于 2013-08-19T12:24:34.203 回答
0

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

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

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

再次感谢大家。

于 2013-08-19T11:57:59.090 回答
0

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

于 2013-08-19T10:43:15.607 回答
0

对于 String split() 方法,您的正则表达式变量没有正确形成...尝试打破正则表达式,如该线程的答案所示...

java - 使用正则表达式拆分字符串

于 2013-08-19T11:00:02.887 回答
0

尝试使用正则表达式

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

因为这会给你结果“一些名字

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

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

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

结果相同

于 2013-08-19T11:03:42.333 回答