正则表达式匹配A、B、AB
Regular expression matching A, B, and AB
我想创建一个匹配 A
、B
和 AB
的正则表达式,其中 A
和 B
是非常复杂的正则表达式表达式。
一种解决方案是使用 (A|A?B)
或 (AB?|B)
,但我必须重复其中一个表达式。
A?B?
不起作用,因为它也匹配空字符串。
是否可以在不重复 A
和 B
的情况下创建此正则表达式?
一般情况下是不可能的。不过,您可以使用一些解决方法。
如果A
和B
以单词字符开始和结束
如果 A
和 B
是 中的或 start/end 字型字符(字母、数字或 _
, 你可以使用
(?<!\w)A?(?:B)?(?!\w)(?<!\W(?!\w))(?<!^(?!\w))
(?<!\w)
- 前不允许出现单词字符
A?
- 一个可选的 A
(?:B)?
- 一个可选的 B
(?!\w)
- 后面不允许有单词字符(此时,我们可以匹配字符串开头和非单词字符之间、非单词字符和字符串结尾之间或之间的空字符串两个非单词字符,因此我们添加...)
(?<!\W(?!\w))
- 如果前面是一个非单词字符,后面没有一个单词字符,则不允许匹配(这会取消两个非单词字符和一个非单词字符之间的空匹配,并且结束字符串)
(?<!^(?!\w))
- 如果后面没有跟一个单词 char,则不允许在字符串开头进行匹配。
避免在基于交替的模式中重复部分表达式
在 PCRE 中,您可以避免重复相同的模式部分,因为您可以通过子例程调用递归子模式:
A(?<BGroup>B)?|(?&BGroup)
参见regex demo。
(?<BGroup>B)
是一个命名捕获组,其模式与 (?&BGroup)
命名子例程调用重复。
我会将 A 和 B 存储到变量中并创建模式
(AB?|B) 来自 A 和 B 通过串联。这具有增强可读性的优点,因为您可以记录子模式 A 和 B。
我想创建一个匹配 A
、B
和 AB
的正则表达式,其中 A
和 B
是非常复杂的正则表达式表达式。
一种解决方案是使用 (A|A?B)
或 (AB?|B)
,但我必须重复其中一个表达式。
A?B?
不起作用,因为它也匹配空字符串。
是否可以在不重复 A
和 B
的情况下创建此正则表达式?
一般情况下是不可能的。不过,您可以使用一些解决方法。
如果A
和B
以单词字符开始和结束
如果 A
和 B
是 中的或 start/end 字型字符(字母、数字或 _
, 你可以使用
(?<!\w)A?(?:B)?(?!\w)(?<!\W(?!\w))(?<!^(?!\w))
(?<!\w)
- 前不允许出现单词字符
A?
- 一个可选的A
(?:B)?
- 一个可选的B
(?!\w)
- 后面不允许有单词字符(此时,我们可以匹配字符串开头和非单词字符之间、非单词字符和字符串结尾之间或之间的空字符串两个非单词字符,因此我们添加...)(?<!\W(?!\w))
- 如果前面是一个非单词字符,后面没有一个单词字符,则不允许匹配(这会取消两个非单词字符和一个非单词字符之间的空匹配,并且结束字符串)(?<!^(?!\w))
- 如果后面没有跟一个单词 char,则不允许在字符串开头进行匹配。
避免在基于交替的模式中重复部分表达式
在 PCRE 中,您可以避免重复相同的模式部分,因为您可以通过子例程调用递归子模式:
A(?<BGroup>B)?|(?&BGroup)
参见regex demo。
(?<BGroup>B)
是一个命名捕获组,其模式与 (?&BGroup)
命名子例程调用重复。
我会将 A 和 B 存储到变量中并创建模式 (AB?|B) 来自 A 和 B 通过串联。这具有增强可读性的优点,因为您可以记录子模式 A 和 B。