java正则表达式匹配以特定字符串开头的每个组
我有一个类似于java正则表达式匹配以特定字符串开头的每个组,java,regex,Java,Regex,我有一个类似于a1wwaxxa1yyalzz的字符串 我想让每一组从a1开始直到下一个a1被排除。 (在我的例子中,我会是:a1ww,a1x,a1yy和azz 如果我使用: Matcher m = Pattern.compile("(a1.*?)a1").matcher("a1wwa1xxa1yya1zz"); while(m.find()) { String myGroup = m.group(1); } myGroup每两组捕获一组。 因此,在我的示例中,我只能捕获a1ww和a1yy
a1wwaxxa1yyalzz
的字符串
我想让每一组从a1开始直到下一个a1被排除。
(在我的例子中,我会是:a1ww
,a1x
,a1yy
和azz
如果我使用:
Matcher m = Pattern.compile("(a1.*?)a1").matcher("a1wwa1xxa1yya1zz");
while(m.find()) {
String myGroup = m.group(1);
}
myGroup
每两组捕获一组。因此,在我的示例中,我只能捕获
a1ww
和a1yy
有人有什么好主意吗?您可以使用split()
方法,然后将“a1”作为前缀添加到拆分的元素中:
String str = "a1wwa1xxa1yya1zz";
String[] parts = str.split("a1");
String[] output = new String[parts.length - 1];
for (int i = 0; i < output.length; i++)
output[i] = "a1" + parts[i + 1];
for (String p : output)
System.out.println(p);
我会使用这样的方法:
String str = "a1wwa1xxa1yya1zz";
String[] parts = str.split("a1");
for (int i = 1; i < parts.length; i++) {
String found = "a1" + parts[i];
}
String str=“a1wwaxxa1yyazz”;
字符串[]部分=str.split(“a1”);
对于(int i=1;i
拆分是一个很好的解决方案,但如果您想留在regex世界,这里有一个解决方案:
Matcher m = Pattern.compile("(a1.*?)(?=a1|$)").matcher("a1wwa1xxa1yya1zz");
while (m.find()) {
String myGroup = m.group(1);
System.out.println("> " + myGroup);
}
我使用了正向前瞻来确保捕获后紧跟着a1
,或者紧跟着行尾
Lookahead是零宽度断言,即,它们在不推进匹配光标的情况下验证条件,因此它们验证的字符串仍可用于进一步测试。谢谢。这个答案对我来说很好,因为我不必修改代码以使答案与拆分匹配。此外,它使我更好地理解了Lookahead。感谢回答。这对我来说已经足够好了,但是regexp-one实现起来更简单/更快。@user1897948 split()也是基于regex的。无论如何,你更喜欢它。@ivanovic为什么不使用
i+1
而不是单独的index
变量?@jlordo谢谢你,伙计,我在第一次刮擦时就编写了一个增强的for循环,这就是为什么它仍然存在的原因=)@jlordo谢谢你,伙计,我在第一个scratch上写了一个增强的for循环,这就是为什么它仍然存在的原因=)
Matcher m = Pattern.compile("(a1.*?)(?=a1|$)").matcher("a1wwa1xxa1yya1zz");
while (m.find()) {
String myGroup = m.group(1);
System.out.println("> " + myGroup);
}