ami*_*mit 16 java regex string
我需要让所有子串匹配正则表达式,我知道我可以为它构建一个自动机,但我正在寻找一个更简单的解决方案.
问题是,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()));
}
Run Code Online (Sandbox Code Playgroud)
结果是,aba
而不是aba,aca
我想要...
任何想法?
编辑:
另一个例子:for string = abaa,regex = a.*a我希望得到aba,abaa,
如果用正则表达式无法实现它,它也是一个答案,我只是想知道我不是为语言已经为我提供的东西重新发明轮子......
Bar*_*ers 17
你可以这样做:
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
打印:
[aba, aca]
[abaa, aa]
Run Code Online (Sandbox Code Playgroud)
唯一的问题是你在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;
}
Run Code Online (Sandbox Code Playgroud)
如果您的文本将保持相对较小,这将起作用,但对于较大的字符串,这可能会变得太计算密集.
默认情况下,新匹配从前一个匹配开始.如果您的匹配可以重叠,则需要手动指定起点:
int start = 0;
while (matcher.find(start)) {
...
start = matcher.start() + 1;
}
Run Code Online (Sandbox Code Playgroud)