gpt4 book ai didi

java - 如何获取给定正则表达式的所有子字符串?

转载 作者:太空狗 更新时间:2023-10-29 22:45:09 27 4
gpt4 key购买 nike

我需要获取与正则表达式匹配的所有子字符串,我知道我可以为它构建一个自动机,但我正在寻找更简单的解决方案。
问题是,Matcher.find() 不会返回所有结果。

String str = "abaca";
Matcher matcher = Pattern.compile("a.a").matcher(str);
while (matcher.find()) {
System.out.println(str.substring(matcher.start(),matcher.end()));
}

结果是 aba 而不是我想要的 aba,aca...
有什么想法吗?
编辑:另一个例子:for string=abaa, regex=a.*a 我期望得到 aba,abaa,aa
附:如果无法使用正则表达式实现,这也是一个答案,我只是想知道我不是为了语言已经提供给我的东西而重新发明轮子...

最佳答案

你可以这样做:

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

public static List<String> getAllMatches(String text, String regex) {
List<String> matches = new ArrayList<String>();
Matcher m = Pattern.compile("(?=(" + regex + "))").matcher(text);
while(m.find()) {
matches.add(m.group(1));
}
return matches;
}

public static void main(String[] args) {
System.out.println(getAllMatches("abaca", "a.a"));
System.out.println(getAllMatches("abaa", "a.*a"));
}
}

打印:

[aba, aca]
[abaa, aa]

唯一的问题是您在最后一个匹配列表中缺少 aba。这是因为 a.*a 中的贪心 .*。你不能用正则表达式来解决这个问题。您可以通过遍历所有可能的子字符串并在每个子字符串上调用 .matches(regex) 来做到这一点:

public static List<String> getAllMatches(String text, String regex) {
List<String> matches = new ArrayList<String>();
for(int length = 1; length <= text.length(); length++) {
for(int index = 0; index <= text.length()-length; index++) {
String sub = text.substring(index, index + length);
if(sub.matches(regex)) {
matches.add(sub);
}
}
}
return matches;
}

如果您的文本保持相对较小,这会起作用,但对于较大的字符串,这可能会变得计算量太大。

关于java - 如何获取给定正则表达式的所有子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5705111/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com