正则表达式匹配A、B、AB

Regular expression matching A, B, and AB

我想创建一个匹配 ABAB 的正则表达式,其中 AB 是非常复杂的正则表达式表达式。

一种解决方案是使用 (A|A?B)(AB?|B),但我必须重复其中一个表达式。

A?B? 不起作用,因为它也匹配空字符串。

是否可以在不重复 AB 的情况下创建此正则表达式?

一般情况下是不可能的。不过,您可以使用一些解决方法。

如果AB以单词字符开始和结束

如果 AB 中的或 start/end 字型字符(字母、数字或 _ , 你可以使用

(?<!\w)A?(?:B)?(?!\w)(?<!\W(?!\w))(?<!^(?!\w))

查看regex demo

  • (?<!\w) -
  • 前不允许出现单词字符
  • A? - 一个可选的 A
  • (?:B)? - 一个可选的 B
  • (?!\w) - 后面不允许有单词字符(此时,我们可以匹配字符串开头和非单词字符之间、非单词字符和字符串结尾之间或之间的空字符串两个非单词字符,因此我们添加...)
  • (?<!\W(?!\w)) - 如果前面是一个非单词字符,后面没有一个单词字符,则不允许匹配(这会取消两个非单词字符和一个非单词字符之间的空匹配,并且结束字符串)
  • (?<!^(?!\w)) - 如果后面没有跟一个单词 char,则不允许在字符串开头进行匹配。

避免在基于交替的模式中重复部分表达式

在 PCRE 中,您可以避免重复相同的模式部分,因为您可以通过子例程调用递归子模式:

A(?<BGroup>B)?|(?&BGroup)

参见regex demo

(?<BGroup>B) 是一个命名捕获组,其模式与 (?&BGroup) 命名子例程调用重复。

参见 Recursive patterns

我会将 A 和 B 存储到变量中并创建模式 (AB?|B) 来自 A 和 B 通过串联。这具有增强可读性的优点,因为您可以记录子模式 A 和 B。