我正在尝试匹配表达式中的两个组,每个组在首字母中表示一个字母作为名称的一部分,例如在George RR Martin中,第一个组匹配第一个R,第二个组匹配第二个R,我有这样的事情:
\b([a-zA-Z])[\.{0,1} {0,1}]{1,2}([a-zA-Z])\b
但是,我想排除这些组的特定组合,例如第一组匹配字母d而第二组匹配字母r。
这可能吗?
答案 0 :(得分:1)
您可以使用否定前瞻限制匹配:
\b(?![dD]\.? ?[rR]\b)([a-zA-Z])\.? ?([a-zA-Z])\b
^^^^^^^^^^^^^^^^^^^
请参阅regex demo
注意:
(?![dD]\.? ?[rR]\b)
前瞻应该更好地放在单词边界之后,这样检查只会在遇到单词边界时触发,而不是在字符串中的每个位置触发d
或D
[dD]
,可选文字点\.?
,可选空格 ?
1}},r
或R
[rR]
和尾字边界\b
。主模式是一种更通用的模式 - \b([a-zA-Z])\.? ?([a-zA-Z])
:
\b
- 领先的字边界(?![dD]\.? ?[rR]\b)
- 负向前瞻([a-zA-Z])
- 第1组捕获ASCII字母\.?
- 一个可选的点 ?
- 可选空格([a-zA-Z])
- 第2组捕获ASCII字母\b
- 尾随字边界