Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.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正则表达式匹配以特定字符串开头的每个组_Java_Regex - Fatal编程技术网

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);
}