regex - 匹配字符(如果存在),否则继续
问题描述
演示: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
a
1-3 有效,因为在和之间只有一个字符W
(我相信这是因为懒惰的+?
运算符)。4 有效,因为不需要W
匹配。
但是 5 不起作用:数字组匹配正确,但W
组为空,尽管 a出现在和W
之间有 2 个字符。a
W
我怎样才能修复它?
解决方案
您可以使用
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
}
推荐阅读
- java - 如何从另一个类构造函数调用变量(长度、宽度、高度)
- c# - 使用具有字体属性的法语文化时,Xamarin Forms Android 中的目标调用异常
- android - 如何判断U盘是否空闲?
- http - 网站在 80 端口没有响应,nginx 定期死机
- python - python指数移动平均线
- html - 删除溢出时导航栏背景不起作用:自动;来自我的 CSS
- powershell - Powershell检查驱动器号是否存在,如果存在则删除
- javascript - 为什么浏览器能理解这个片段,而我的 typescript 编译器却不能?
- rest - WSO2 数据服务、企业集成商和数据映射器中介
- python - 我无法使用具有不同数量预期值的 pd.read_csv 读取此 CSV 文件