Perl Simple Regexp

时间:2013-11-11 16:59:50

标签: regex perl

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

无效字符串为:somestr xyz tipxyztip之间的空格)

我已经尝试了很多组合,但是我无法让正则表达式在“xyz”之间的空格处停留。 &安培; '尖端&#39 ;.下面的那个是我认为应该起作用的:

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

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

我在这里错过了什么?

3 个答案:

答案 0 :(得分:1)

假设xyz不能在字符串中的任何位置,除了tip之前,以下内容应该有效:

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

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

答案 1 :(得分:0)

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

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

Regular expression visualization

来自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 $&.

答案 2 :(得分:0)

您可以使用:

^(?>[^ ]++| (?!xyz))+ (?:xyz)?tip$