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

3
我希望创建一个正则表达式,匹配ABAB,其中AB都是相当复杂的正则表达式。
一种解决方法是使用(A|A?B)(AB?|B),但这样我必须重复其中一个表达式。 A?B?不起作用,因为它还匹配空字符串。
是否有可能创建这个正则表达式而既不重复A也不重复B
2个回答

3

一般来说,这是不可能的。但你可以使用一些变通方法。

如果 AB 以单词字符开头和结尾

如果 AB 是或者以单词字符(字母、数字或 _)开头/结尾,你可以使用

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

查看正则表达式演示

  • (?<!\w) - 前面不允许出现单词字符
  • A? - 可选的一个 A
  • (?:B)? - 可选的一个 B
  • (?!\w) - 后面不允许出现单词字符(在这一点上,我们可能会匹配从字符串开头到非单词字符之间的空字符串,在非单词符和字符串结尾之间或在两个非单词字符之间的空字符串,因此我们需要添加...)
  • (?<!\W(?!\w)) - 如果前面是一个非单词字符且后面没有跟随单词字符,则不允许匹配(这取消了两个非单词字符和一个非单词字符和字符串结尾之间的空匹配)
  • (?<!^(?!\w)) - 如果在字符串开头且后面没有跟随单词字符,则不允许匹配。

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

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

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

请查看正则表达式演示

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

请参见递归模式


2

我建议将A和B存储到变量中,并通过连接操作从A和B创建模式(AB?|B)。这种方法的优点是增强了可读性,因为您可以记录子模式A和B。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接