匹配字符(如果存在),否则继续

时间:2020-05-07 10:28:30

标签: regex dart

演示: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之所以起作用,是因为aW之间只有一个字符(我相信这是由于懒惰的+?运算符)。 4有效,因为不需要W

但是5不起作用:数字组正确匹配,但是W组为空,尽管发生WaW之间有2个字符

如何解决?

1 个答案:

答案 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
}