A后跟“不是A”,然后是B

时间:2015-07-27 06:19:07

标签: regex

我需要一个正则表达式,它将捕获(文字)AA和(文字)BB之间的任意内容,并且限制它只匹配最接近BB的AA。

例如,给定:

AA stuff1 BB

它会捕获“stuff1”,但是会给出

AA stuff1 AA stuff2 BB

它会捕获“stuff2”而不是“stuff1 AA stuff2”。

一种可能的解决方案

在真棒online regex tester的帮助下,我想出了以下内容:

/AA((?:.(?!AA))+)BB/

它使用否定前瞻来排除以AA结尾的任何匹配。这有效 - 我对此很好 - 但是有更好的方法吗?

更新

AA和BB是(可能)包含空格的标记,例如“截止日期”和“账单日期”。所以\ w和它的朋友们不会在这里帮忙。

'stuff'可能跨越多行。

源字符串中只有一个BB实例。

我在javascript工作,但我不想使用任何特定语言的RegEx怪癖。当然,你需要[^]匹配javascript中的'包括换行符的任何字符',这是允许的。

我在'stuff1'等处添加空格以表明是的,它应该捕获空格。

3 个答案:

答案 0 :(得分:2)

我认为你不需要在这里使用前瞻 - 对于以下两个测试用例,这是good enough

/.*AA(.*?)BB/

AA stuff1 AA stuff2 BB blabla  # matches ` stuff2 `
AA stuff3 AA stAAuff4 BB # matches `uff4 `

答案 1 :(得分:0)

您的解决方案非常合理。另一种方式是

/AA[^A](?:[^A]|.[^A])*BB/

请注意,我添加了第一个[^A],以便AAAxBB能够获得AAxBB的匹配而不是整个字符串(因为这实际上是AA的更接近两个)。

答案 2 :(得分:0)

您可以使用\b改进正则表达式,并在使用字符之前先进行预测,而不是消费然后再进行检查。

\bAA\b((?:(?!\bAA\b).)+)\bBB\b

Demo on regex101