【发布时间】: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 够公平