我希望使用一行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
`
答案 0 :(得分:2)
你正则表达式匹配整个字符串。因此,在拆分时,整个字符串被删除。它与"a".split("a")
完全相同,后者返回一个空数组。
您可以使用的是:
queryText.replaceAll(".*name <equals> `([^`]+)`.*", "$1")
返回some name
。
答案 1 :(得分:0)
你的正则表达式涵盖了所有的字符串。尝试删除“^”和“$”。 Split方法希望表达式不删除必须找到的表达式来检测特定的子字符串。
答案 2 :(得分:0)
你的正则表达式变量没有为String split()方法正确形成...尝试打破正则表达式,如此线程的答案所示......
答案 3 :(得分:0)
尝试使用正则表达式
((?<=`)[^`]*(?=`$))
因为这会从
中获得结果“某个名称”id <equals> `1` <AND> name <equals> `some name`
或者如果“某个名称”并不总是出现在最后,您可以使用
((?<=name <equals> `)[^`]*(?=`))
具有相同的结果
答案 4 :(得分:0)
感谢所有的输入。 [m.buettner]是对的。我只是误解了String.split()
应该做什么。根据Java文档..
此方法的工作方式就像通过调用双参数split方法一样 给定的表达式和一个零的限制参数。尾随空 因此,字符串不包含在结果数组中。
这不是我想要的。我将仅使用Pattern + Matcher创建一个util方法。
再次感谢大家。