regex 如何在特定关键字后提取多个匹配模式的值?

vpfxa7rd  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(141)

将需要帮助如何提取多个护照号码匹配后的护照关键字使用正则表达式的
文字说明:

my friends passport numbers are V123456, V123457 and V123458

Regex:

(?<=passport)\s*(?:\w+\s){0,10}\s*(\b[a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2}\b)

预期匹配输出:

V123456
V123457
V123458

实际产量:

V123456
mzmfm0qo

mzmfm0qo1#

在这里不能依赖于向后查找,因为您需要一个不确定长度的模式。它是支持的,但仅在最新的Java版本中。
您可以使用基于\G operator的模式:

(?:\G(?!\A)|\bpassport\b).*?\b([a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2})\b

参见regex demo。* 图案详情 *:

  • (?:\G(?!\A)|\bpassport\b)-整个单词 passport\bpassport\b)或(|)上一个成功匹配的结尾(\G(?!\A)
  • .*?-尽可能少的零个或多个字符(因为模式是用Pattern.DOTALL编译的,所以.可以匹配任何字符,包括换行符)
  • \b([a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2})\b-以0、1或2个ASCII字母开头,然后有6到12个数字,以0、1或2个ASCII字母结尾的完整单词。

请参阅下面的Java demo

String s = "my friends passport numbers are V123456, V123457 and V123458";
String rx = "(?:\\G(?!^)|\\bpassport\\b).*?\\b([a-zA-Z]{0,2}\\d{6,12}[a-zA-Z]{0,2})\\b";
Pattern pattern = Pattern.compile(rx, Pattern.DOTALL);
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
}

输出量:

V123456
V123457
V123458

相关问题