Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用split提取重叠匹配_Java_Regex_Split - Fatal编程技术网

Java 使用split提取重叠匹配

Java 使用split提取重叠匹配,java,regex,split,Java,Regex,Split,如何使用String.split()从输入中提取重叠匹配 例如,如果尝试查找与“aba”的匹配项: 预期产出: [aba, aba, aba] 这不是正确使用split()。从: 围绕给定正则表达式的匹配项拆分此字符串 在我看来,您并不是在尝试拆分字符串,而是在字符串中查找正则表达式的所有匹配项。为此,您必须使用,以及在匹配器上循环的一些额外代码来查找所有匹配项,然后创建数组 String#split不会提供重叠匹配。因为字符串的特定部分将只包含在获取的数组的唯一索引中,而不包含在两个索引中

如何使用
String.split()
从输入中提取重叠匹配

例如,如果尝试查找与
“aba”
的匹配项:

预期产出:

[aba, aba, aba]

这不是正确使用
split()
。从:

围绕给定正则表达式的匹配项拆分此字符串

在我看来,您并不是在尝试拆分字符串,而是在字符串中查找正则表达式的所有匹配项。为此,您必须使用,以及在
匹配器上循环的一些额外代码来查找所有匹配项,然后创建数组

String#split
不会提供重叠匹配。因为字符串的特定部分将只包含在获取的数组的唯一索引中,而不包含在两个索引中

您应该在这里使用
Pattern
Matcher
类。 您可以使用此正则表达式:-

Pattern pattern = Pattern.compile("(?=(aba))");
然后使用
Matcher#find
方法获得所有重叠匹配,并为其打印
group(1)

上面的正则表达式匹配每个空字符串,后跟
aba
,然后只打印第一个捕获的组。现在,由于
look-ahead
是零宽度断言,因此它不会使用匹配的字符串。因此,您将获得所有重叠匹配

String input = "abababa";
String patternToFind = "aba";

Pattern pattern = Pattern.compile("(?=" + patternToFind + ")");
Matcher matcher = pattern.matcher(input);

while (matcher.find()) {
    System.out.println(patternToFind + " found at index: " + matcher.start());
}
输出:-

aba found at index: 0
aba found at index: 2
aba found at index: 4
我会使用indexOf

for(int i = text.indexOf(find); i >= 0; i = text.indexOf(find, i + 1))
   System.out.println(find + " found at " + i);

您确定它不是
[ababa,ababa]
还是只能重叠一个字符?无论如何,我怀疑你不能用正则表达式来做这件事。出于兴趣,你为什么要这么做?您将如何拆分
cababa
?您确定
split
是您想要的吗?听起来更像是你在尝试
查找匹配项。@PeterLawrey编辑了这个问题以使它更清楚。很抱歉没有在问题中添加受欢迎的匹配项。我真的很喜欢简洁,但我选择的是基于正则表达式的解决方案。这可以修改为使用正则表达式来查找模式吗?你可以使用Rohit Jain的解决方案。你为什么要创建一个组?像往常一样,您使用的代码/复杂度超出了需要。这里给你一个挑战:如果你消除了团队,简化了代码,我会接受这个答案。@Bohemian。您只需删除该组,然后打印
aba
,而不是
group 1
。那一组只不过是你所匹配的模式。你知道的。@Bohemian。。好了。编辑以删除组。@Bohemian。。我不得不这么说,但你不使用
捕获组
的理由并不充分。如果没有捕获组,正则表达式的一半功能将丢失。在这个例子中,它是不需要的,但不能证明它完全不是必需的。例如,假设我让你找出这个字符串中紧跟着一个
的所有数字,以及
后面的字符-
“asf234#afl234#sdf”
,你将如何实现这一点?当您希望基于某种模式提取目标字符串的某些部分时,捕获组是必需的。与上述情况类似,您只需使用模式-
(\d)#(.)
,并提取两个捕获组。就人类的可读性而言,我认为这根本不会受到影响。阅读俘获的群体并不是一件必须如此强调的事情。这在正则表达式中很常见,它需要一些正则表达式的技巧才能与Matcher(零宽度环视)一起工作。
for(int i = text.indexOf(find); i >= 0; i = text.indexOf(find, i + 1))
   System.out.println(find + " found at " + i);