我有一个像a1wwa1xxa1yya1zz
这样的字符串。
我想让每个小组以a1开头,直到下一个a1被排除在外。
(在我的示例中,我将是:a1ww
,a1xx
,a1yy
和a1zz
如果我使用:
Matcher m = Pattern.compile("(a1.*?)a1").matcher("a1wwa1xxa1yya1zz");
while(m.find()) {
String myGroup = m.group(1);
}
myGroup
每两组捕获1组
因此,在我的示例中,我只能捕获a1ww
和a1yy
。
任何人都有一个好主意?
答案 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];
}