Java模式在`ABC`中找到两组两个字母
我有一个这样定义的模式:
private static final Pattern PATTERN = Pattern.compile("[a-zA-Z]{2}");
在我的代码中,我这样做:
Matcher matcher = PATTERN.matcher(myString);
并使用while循环查找所有匹配项。
while (matcher.find()){ //do something here }
如果myString
是12345AB3CD45
,匹配器会找到两组两个字母( AB
和CD
)。 问题是我有时myString
为12345ABC356
所以我希望匹配器找到,首先是AB
,然后是BC
(只找到`AB)。
我做错了还是正则表达式错了或匹配器不能这样工作?
放置在组0(整个比赛)中的文本片段不能在下一场比赛中重复使用,成为组0的一部分。
12345ABC356 ^^ - AB was placed in standard match (group 0) ^^ - B can't be reused here as part of standard match
您可以使用预览等周边机制解决此问题,这种机制不会消耗匹配的部分(它们是零长度),但您可以将其内容放在您将能够访问的单独捕获组中。
所以你的代码看起来像
private static final Pattern PATTERN = Pattern.compile("[a-zA-Z](?=([a-zA-Z]))"); // ^^^^^^^^ ^^^^^^^^^^ // group 0 group 1 //... Matcher matcher = PATTERN.matcher(myString); while (matcher.find()){ String match = matcher.group() + matcher.group(1); //... }
你不能用正则表达式多次匹配相同的位置,但你可以使用技巧。
为此,您需要将模式包含在前瞻和捕获组中:
(?=([A-Za-z]{2}))
,因为前瞻不匹配任何字符而只消耗一个位置。
您要查找的结果位于捕获组1中。