5

我有一个像a1wwa1xxa1yya1zz.

我想让每个组从 a1 开始直到下一个 a1 被排除。(在我的例子中,我会是 : a1ww, a1xx, a1yyanda1zz

如果我使用:

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

myGroup每两组抓1组。
所以在我的例子中,我只能捕获a1wwa1yy.

有人有好主意吗?

4

3 回答 3

5

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

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

我使用了积极的前瞻来确保捕获之后是a1,或者是行尾。

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

于 2012-12-12T14:02:05.863 回答
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
于 2012-12-12T13:50:00.393 回答
0

我会使用这样的方法:

    String str = "a1wwa1xxa1yya1zz";
    String[] parts = str.split("a1");
    for (int i = 1; i < parts.length; i++) {
        String found = "a1" + parts[i];
    }
于 2012-12-12T13:54:19.890 回答