演示:https://regex101.com/r/5EVbAJ/1
我有这个正则表达式:
a.+?(W)?.*?(\d)
我的意图:如果字符W存在于字符串中,则将字符W作为组。否则返回空组。第二组是也需要匹配的现有号码。
我的测试数据:
1. a,W1
2. a W1
3. a,W 1
4. a, V1
5. a, W1 //fail
1-3之所以起作用,是因为a
和W
之间只有一个字符(我相信这是由于懒惰的+?
运算符)。 4有效,因为不需要W
。
但是5不起作用:数字组正确匹配,但是W
组为空,尽管发生W
且a
和W
之间有2个字符
如何解决?
答案 0 :(得分:1)
您可以使用
a(?:.+?(W))?.*?(\d)
这里,技巧是在.+(W)
模式部分周围使用一个非捕获组,以使正则表达式引擎至少一次匹配此模式。这意味着(W)
被设置为强制模式,因此如果W
位于a
之后的任何1个或多个字符之后(除换行符以外),都将填充第1组。>
飞镖测试:
final regex = RegExp(r'a(?:.+?(W))?.*?(\d)');
Iterable<Match> matches = regex.allMatches("5. a, W1");
for (Match match in matches) {
print(match.group(1)); // => W
print(match.group(2)); // => 1
}