java正则表达式匹配每个组以特定字符串开头

时间:2012-12-12 13:46:53

标签: java regex

我有一个像a1wwa1xxa1yya1zz这样的字符串。

我想让每个小组以a1开头,直到下一个a1被排除在外。 (在我的示例中,我将是:a1wwa1xxa1yya1zz

如果我使用:

Matcher m = Pattern.compile("(a1.*?)a1").matcher("a1wwa1xxa1yya1zz");
while(m.find()) {
  String myGroup = m.group(1);
}

myGroup每两组捕获1组 因此,在我的示例中,我只能捕获a1wwa1yy

任何人都有一个好主意?

3 个答案:

答案 0 :(得分:5)

Split是一个很好的解决方案,但是如果你想留在正则表达式世界中,这是一个解决方案:

Matcher m = Pattern.compile("(a1.*?)(?=a1|$)").matcher("a1wwa1xxa1yya1zz");
while (m.find()) {
  String myGroup = m.group(1);
  System.out.println("> " + myGroup);
}

我使用了一个积极的先行,以确保捕获后跟a1,或者行尾。

Lookahead是零宽度断言,即。他们在不推进匹配光标的情况下验证条件,因此他们验证的字符串仍可用于进一步测试。

答案 1 :(得分:3)

您可以使用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);

<强>输出:

a1ww
a1xx
a1yy
a1zz

答案 2 :(得分:0)

我会使用这样的方法:

    String str = "a1wwa1xxa1yya1zz";
    String[] parts = str.split("a1");
    for (int i = 1; i < parts.length; i++) {
        String found = "a1" + parts[i];
    }