我想用regex来分割我的字符串。它应该包括在每个分隔符之前和之后的零长度匹配。例如,如果分隔符是^,而我的字符串是^^^,我希望得到4个零长度组。我不能只使用regex = "([^\\^]*)",因为在分隔符之间的每一次真正匹配之后,它都会包含额外的零长度匹配。因此,我决定在行开始后或之后使用非分隔符符号。它在https://regex101.com/上工作得很好(很抱歉,我在这个网站上找不到一个共享选项来分享我的例子),但是在Intellij IDEa中它跳过了一次匹配。
所以,现在我的代码是:
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个空字符串匹配。但我只有四个:
[0-0]: ""
[2-2]: ""
[3-3]: ""
[4-4]: ""问题是,为什么它跳过1-1匹配,我如何修复它?
发布于 2018-09-06 10:14:35
正则表达式要么匹配字符串的开始,要么匹配^ (将其捕获到组1中),然后将除^之外的任何0+字符匹配到组2。当找到第一个匹配(字符串的开始)时,第一个组保留一个空字符串(因为它是字符串的开始),而第二个组也保留一个空字符串(因为第一个字符是^,[^^]*可以在不匹配的字符之前匹配空字符串)。整个匹配为零长度,regex引擎将regex索引移动到下一个位置。因此,在第一次匹配之后,regex索引将从字符串的开始移动到第一个^之后的位置。然后,找到第二个匹配,第二个^和后面的空字符串。因此,第一个^不匹配,它被跳过。
解决方案是一个简单的split解决方案:
String[] result = string.split("\\^", -1);第二个参数使方法输出结果数组末尾的所有空匹配。
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
""
""
""
""
""https://stackoverflow.com/questions/52200772
复制相似问题