Java模式在'ABC'中查找两组两个字母`
我有一个定义如下的模式:Java模式在'ABC'中查找两组两个字母`,java,regex,Java,Regex,我有一个定义如下的模式: 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,则匹配器正在查找这两组两
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')
是我做错了,还是正则表达式做错了,或者匹配器不是这样工作的?你不能用正则表达式多次匹配同一个位置,但你可以使用技巧 要做到这一点,您需要将模式包含在一个组和一个捕获组中:
(?=([A-Za-z]{2}))
,因为前瞻不匹配任何字符,只占用一个位置
您要查找的结果在捕获组1中。您不能将同一位置与正则表达式多次匹配,但可以使用技巧 要做到这一点,您需要将模式包含在一个组和一个捕获组中:
(?=([A-Za-z]{2}))
,因为前瞻不匹配任何字符,只占用一个位置
您要查找的结果在捕获组1中。您不能将同一位置与正则表达式多次匹配,但可以使用技巧 要做到这一点,您需要将模式包含在一个组和一个捕获组中:
(?=([A-Za-z]{2}))
,因为前瞻不匹配任何字符,只占用一个位置
您要查找的结果在捕获组1中。您不能将同一位置与正则表达式多次匹配,但可以使用技巧 要做到这一点,您需要将模式包含在一个组和一个捕获组中:
(?=([A-Za-z]{2}))
,因为前瞻不匹配任何字符,只占用一个位置
您正在查找的结果位于捕获组1中。放置在组0(整个匹配)中的文本片段不能在下一个匹配中重新使用,以成为组0的一部分
12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们
所以你的代码看起来像
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);
//...
}
放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用
12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们
所以你的代码看起来像
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);
//...
}
放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用
12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们
所以你的代码看起来像
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);
//...
}
放置在组0(整个匹配)中的文本片段无法在作为组0一部分的下一个匹配中重用
12345ABC356
^^-AB被置于标准匹配(第0组)
^^-B不能在此处作为标准匹配的一部分重复使用
您可以使用环视机制来解决这个问题,例如,不使用匹配的部分(它们的长度为零),但您可以将它们的内容放在单独的位置,这样您就可以访问它们
所以你的代码看起来像
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);
//...
}
谢谢通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我成功地解决了我的问题。谢谢。通过您的实施,我已经设法解决了我的问题。谢谢您的解释。谢谢您的解释。谢谢您的解释。谢谢您的解释。