首页 > 解决方案 > 匹配字符(如果存在),否则继续

问题描述

演示:https ://regex101.com/r/5EVbAJ/1

我有这个正则表达式:

a.+?(W)?.*?(\d)

我的意图:如果字符存在于字符串中,则将字符 W 作为组。否则返回空组。第二组是需要匹配的现有号码。

我的测试数据:

1. a,W1
2. a W1
3. a,W 1
4. a, V1

5. a, W1 //fail

a1-3 有效,因为在和之间只有一个字符W(我相信这是因为懒惰的+?运算符)。4 有效,因为不需要W匹配。

但是 5 不起作用:数字组匹配正确,但W组为空,尽管 a出现在和W之间有 2 个字符。aW

我怎样才能修复它?

标签: regexdart

解决方案


您可以使用

a(?:.+?(W))?.*?(\d)

在这里,诀窍是在模式部分周围使用非捕获组,.+(W)以使正则表达式引擎至少匹配该模式一次。这意味着(W)是一种强制性模式,因此如果第 1 组W出现在除换行符之外的任何 1 个或多个字符之后,则第 1 组将被填充a

飞镖测试:

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
}

推荐阅读