如何在后顾正则表达式中使用量词(*或+)?

5

我正在学习具有环视(lookbehind 和 lookahead)功能的正则表达式,但我无法在 lookbehind 中使用 .*.+ 量词(但是在 lookahead 中可以使用)。

我正在尝试修复的正则表达式如下:

(?<!yellow.*)blue(?=.*brown)

这个想法是匹配不含 yellow,但只有在蓝色之后存在 brown 的行。以下是一些示例:

yellow blue brown                    // shouldn't match
f blue brown                         // should match
sdff blue brown                      // should match
asdf  f blue c                       // shouldn't match
yellow blue fblue b f brown          // shouldn't match

以下是我的测试:

http://regex101.com/r/fY4kI9/5

我收到的错误信息是:

. * Lookbehinds需要是零宽度,因此不允许使用量词

您知道如何解决这个问题吗?


1
哪个正则表达式?许多(大多数?)正则表达式不支持可变长度的后顾断言。您可以通过使用 {0, 100} 或类似方法来欺骗其中的一些。 - Boris the Spider
1
你在这里使用什么编程语言/工具? - anubhava
@anubhava 我只想要正则表达式,不使用任何特定的语言。 - Federico Piazza
2
@Fede,那完全没有意义。正则表达式是由引擎实现的,它们具有不同的功能。说你只想要正则表达式是毫无意义的。即使您提供给测试器的链接也有一个“flavours”选择器,可以更改正在模拟的引擎。 - Boris the Spider
1
@Fede:不同的编程语言有不同的实现方式;有些支持无限长度的回溯,但有些则不支持。如果你使用的正则表达式引擎支持它,那么可能的答案也会有所不同。这就是为什么我们要问你在哪个平台上使用正则表达式。 - Amal Murali
显示剩余2条评论
1个回答

2
您可以使用此正则表达式而不使用可变长度的回顾,但仍然可以获得相同的功能:
.*yellow.*(*SKIP)(*F)|^.*\bblue\b(?=.*brown).*$

Working Demo


不错。但这是否仍然匹配“sdff blue brown yellow”? - Amal Murali
此外,这只匹配“blue”,但我认为OP想要匹配整行。 - badger5000
The idea is to match lines that don't have yellow” — 据我理解,OP想要匹配不包含“yellow”的行,并且在其中蓝色后面跟着棕色。 - Amal Murali
哦,这很简单,只需在末尾添加.*,即yellow.*(*SKIP)(*F)|\bblue\b(?=.*brown).* - anubhava
@anubhava 需要再进行一次编辑以匹配行的开头:.*yellow.*(*SKIP)(*F)|.*\bblue\b(?=.*brown).*(否则在 purple blue brown 中它只会匹配到 blue brown)。 - badger5000
显示剩余3条评论

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