我正在尝试匹配以下语言:
L = {a^nb^m | (n+m) is even }
也就是说,n a 后跟 m b 以便 (n+m) 是偶数。我构建了以下正则表达式
((aa)*(bb)*)|(a(aa)*b(bb)*)
但它只匹配备选方案的第一部分,而不匹配第二部分(用 https://regex101.com/r/c5HucF/1/ 测试)。它不会匹配 aaabbb。当我删除第一个选择时,只留下 (a(aa)*b(bb)*),aaabbb 匹配得很好。我错过了什么?
答案 0 :(得分:2)
看来这里的主要标准是 n+m 是偶数,因此您可以尝试:
^(?=(?:..)+$)a+b+$
查看在线demo
^
- 起始字符串锚点。(?=
- 正向预测:
(?:
- 非捕获组:
..
- 除换行符以外的任意两个字符。)+$
- 关闭非捕获组并匹配 1+ 次直到结束字符串。)
- 关闭正向前瞻。a+b+
- 1+ 次“a”和 1+ 次“b”。$
- 结束字符串锚点。如果您希望将“bb”与“a^0”视为有效输入的位置相匹配,我想您可以将 +
中的 a+b+
更改为 *
。< /p>