为了账号安全,请及时绑定邮箱和手机立即绑定

Java正则表达式。排除分隔符的组

Java正则表达式。排除分隔符的组

qq_花开花谢_0 2021-09-03 10:24:51
我正在尝试使用正则表达式拆分我的字符串。它甚至应该在每个分隔符之前和之后包括零长度匹配。例如,如果分隔符是^并且我的字符串是^^^我希望得到 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 个空字符串匹配。但我只有 4 个:[0-0]: ""[2-2]: ""[3-3]: ""[4-4]: ""问题是为什么它会跳过 [1-1] 匹配,我该如何解决?
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

您的正则表达式匹配字符串的开头或 a ^(将其捕获到第 1 组),然后^匹配第 2 组以外的任何 0+ 个字符。找到第一个匹配项(字符串的开头)时,第一个组保留一个空字符串(因为它是字符串的开始)并且 Group 2 也持有一个空字符串(因为第一个字符是^并且[^^]*可以在不匹配的字符之前匹配一个空字符串。整个匹配是零长度的,并且正则表达式引擎移动正则表达式索引到下一个位置。因此,在第一次匹配之后,正则表达式索引从字符串的开头移动到第一个之后的位置^。然后,找到第二个匹配项,第二个匹配项^和其后的空字符串。因此,第一个^不匹配,跳过。


解决方法很简单 split:


String[] result = string.split("\\^", -1);

第二个参数使该方法在结果数组的末尾输出所有空匹配项。


查看Java 演示:


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

""

""

""

""

""



查看完整回答
反对 回复 2021-09-03
  • 1 回答
  • 0 关注
  • 201 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信