将需要帮助如何提取多个护照号码匹配后的护照关键字使用正则表达式的文字说明:
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
mzmfm0qo1#
在这里不能依赖于向后查找,因为您需要一个不确定长度的模式。它是支持的,但仅在最新的Java版本中。您可以使用基于\G operator的模式:
\G
(?:\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)
\bpassport\b
|
\G(?!\A)
.*?
Pattern.DOTALL
.
\b([a-zA-Z]{0,2}\d{6,12}[a-zA-Z]{0,2})\b
请参阅下面的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)); }
输出量:
1条答案
按热度按时间mzmfm0qo1#
在这里不能依赖于向后查找,因为您需要一个不确定长度的模式。它是支持的,但仅在最新的Java版本中。
您可以使用基于
\G
operator的模式:参见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:
输出量: