我有一个String
形式:
1,2,3,4,5,6,7,8,...
我正在尝试查找此字符串中包含4位数字的所有子字符串。为此,我有正则表达式[0-9],[0-9],[0-9],[0-9]
。不幸的是,当我尝试将正则表达式与我的String匹配时,我从未获得所有子串,只是所有可能子串的一部分。例如,在上面的示例中,我只会得到:
1,2,3,4
-5,6,7,8-
虽然我希望得到:
1,2,3,4
-2,3,4,5-
-3,4,5,6-
...
我如何找到与我的正则表达式相对应的所有匹配?
有关信息,我使用Pattern
和Matcher
查找匹配项:
Pattern pattern = Pattern.compile([0-9],[0-9],[0-9],[0-9]);
Matcher matcher = pattern.matcher(myString);
List<String> matches = new ArrayList<String>();
while (matcher.find())
{
matches.add(matcher.group());
}
答案 0 :(得分:4)
默认情况下,对Matcher.find()
的连续调用从上一场比赛的结束开始。
要从特定位置查找,请将一个字符的起始位置参数传递给前一个find
开头后的一个字符的find
。
在你的情况下可能是这样的:
while (matcher.find(matcher.start()+1))
这很好用:
Pattern p = Pattern.compile("[0-9],[0-9],[0-9],[0-9]");
public void test(String[] args) throws Exception {
String test = "0,1,2,3,4,5,6,7,8,9";
Matcher m = p.matcher(test);
if(m.find()) {
do {
System.out.println(m.group());
} while(m.find(m.start()+1));
}
}
印刷
0,1,2,3
1,2,3,4
...
答案 1 :(得分:2)
如果您正在寻找纯正的基于正则表达式的解决方案,那么您可以使用这个基于前瞻性的正则表达式来重叠匹配:
(?=((?:[0-9],){3}[0-9]))
请注意,您的匹配在捕获的组#1中可用
<强>代码:强>
final String regex = "(?=((?:[0-9],){3}[0-9]))";
final String string = "0,1,2,3,4,5,6,7,8,9";
final Pattern pattern = Pattern.compile(regex);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println(matcher.group(1));
}
<强>输出:强>
0,1,2,3
1,2,3,4
2,3,4,5
3,4,5,6
4,5,6,7
5,6,7,8
6,7,8,9
答案 2 :(得分:1)
一些没有正则表达式的示例代码(因为它对我来说似乎没用)。此外,我认为正则表达式在这种情况下会变慢。然而,只要数字长度仅为1个字符,它才能正常工作。
String s = "a,b,c,d,e,f,g,h";
for (int i = 0; i < s.length() - 8; i+=2) {
System.out.println(s.substring(i, i + 7));
}
此字符串的输出:
a,b,c,d
b,c,d,e
c,d,e,f
d,e,f,g
答案 3 :(得分:1)
正如@OldCurmudgeon指出的那样,find()
默认情况下从上一场比赛结束开始。要在第一个匹配元素之后定位它,将第一个匹配区域作为捕获组引入,并使用它的结束索引:
Pattern pattern = Pattern.compile("(\\d,)\\d,\\d,\\d");
Matcher matcher = pattern.matcher("1,2,3,4,5,6,7,8,9");
List<String> matches = new ArrayList<>();
int start = 0;
while (matcher.find(start)) {
start = matcher.end(1);
matches.add(matcher.group());
}
System.out.println(matches);
结果
[1,2,3,4, 2,3,4,5, 3,4,5,6, 4,5,6,7, 5,6,7,8, 6,7,8,9]
如果匹配区域长于一位数
,此方法也可以使用