我正在尝试使用正则表达式拆分字符串。在每个定界符之前和之后,它甚至应包括零长度的匹配项。例如,如果定界符为^
,而我的字符串为^^^
,则我希望得到4个零长度组。
我不能只使用regex = "([^\\^]*)"
,因为它将在定界符之间的每个 true 匹配之后包括额外的零长度匹配。
因此,我决定在行的开头或定界符之后使用非定界符。它可以在https://regex101.com/ 上完美运行(很抱歉,我无法在此网站上找到共享选项来共享我的示例),但是在Intellij IDEa中,它会跳过一个匹配项。 / p>
所以,现在我的代码是:
final String regex = "(^|\\^)([^\\^]*)";
final String string = "^^^^";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find())
System.out.println("[" + matcher.start(2) + "-" + matcher.end(2) + "]: \"" + matcher.group(2) + "\"");
,我希望有5个空字符串匹配。但是我只有4个:
[0-0]: ""
[2-2]: ""
[3-3]: ""
[4-4]: ""
问题是为什么它会跳过[1-1]比赛,我该如何解决?
答案 0 :(得分:2)
您的正则表达式匹配字符串的开头或^
(将其捕获到组1中),然后将^
以外的任何0+字符匹配到组2中。找到第一个匹配项(字符串的开头),第一个组保留一个空字符串(因为它是字符串的开始),而第2组也保留一个空字符串(因为第一个字符为^
并且[^^]*
可以匹配一个空字符串,位于不匹配的字符之前。整个匹配的长度为零,并且regex引擎将regex索引移至下一个位置。因此,在第一个匹配项之后,regex索引从字符串的开头移至第一个^
之后的位置,然后找到第二个匹配项,第二个^
及其后的空字符串,因此,第一个^
不匹配,因此被跳过。
解决方案是一个简单的split
:
String[] result = string.split("\\^", -1);
第二个参数使方法在结果数组的末尾输出所有空匹配项。
查看Java demo:
String str = "^^^^";
String[] result = str.split("\\^", -1);
System.out.println("Number of items: " + result.length);
for (String s: result) {
System.out.println("\"" + s+ "\"");
}
输出:
Number of items: 5
""
""
""
""
""