0

我有一个有效的字符串,somestr xyztip,其中xyz是可选的。但如果xyz确实存在,它需要在旁边tip(没有空格)。所以有效的字符串是:somestr tipsomestr xyztip

无效的字符串是:(和somestr xyz tip 之间的空格)xyztip

我尝试了很多组合,但我无法让正则表达式在“xyz”和“tip”之间的空格处犹豫。下面的一个是我认为应该起作用的:

/^.+?\s(xyz)?tip$/

问题是 '(xyz)?' 之前的语法。- 那是 '.+?\s' 。这是说任何 char 1 次或更多次,而不是贪婪地后跟一个空格。

我在这里想念什么?

4

3 回答 3

1

假设xyz除了紧接 before 之外,它不能在字符串中的任何位置tip,以下应该有效:

/^((?!xyz).)+\s(xyz)?tip$/

这会将 更改.+?((?!xyz).)+。通过将负前瞻放在重复组中,我们可以匹配任意数量的字符,但如果遇到 则停止xyz,因此((?!xyz).)+将匹配“fooxyz”中的“foo”。这使我们能够确保它xyz永远不会与正则表达式的第一部分匹配,因此如果它存在,它必须在(xyz)?tip正则表达式的部分中。

于 2013-11-11T17:15:24.453 回答
0

你可以使用这个:

^(?>[^ ]++| (?!xyz))+ (?:xyz)?tip$
于 2013-11-11T17:43:22.433 回答
0

你需要的是一个“零宽度正向预测断言”......所以,你的正则表达式看起来像:

\S+\s(?:xyz)?(?=tip)

正则表达式可视化

来自perldoc perlre

"(?=pattern)"
    A zero-width positive look-ahead assertion.  For example, "/\w+(?=\t)/"
    matches a word followed by a tab, without including the tab in $&.
于 2013-11-11T17:13:13.780 回答