我有一个有效的字符串somestr xyztip
,其中xyz
是可选的。但如果xyz
确实存在,则需要在tip
旁边(没有空格)。
因此有效字符串为:somestr tip
或somestr xyztip
。
无效字符串为:somestr xyz tip
(xyz
和tip
之间的空格)
我已经尝试了很多组合,但是我无法让正则表达式在“xyz”之间的空格处停留。 &安培; '尖端&#39 ;.下面的那个是我认为应该起作用的:
/^.+?\s(xyz)?tip$/
问题是'(xyz)之前的语法?' - 那就是'。+?\ s' 。这是任何一次或多次char,而不是贪婪,后面是一个空格。
我在这里错过了什么?
答案 0 :(得分:1)
假设xyz
不能在字符串中的任何位置,除了tip
之前,以下内容应该有效:
/^((?!xyz).)+\s(xyz)?tip$/
这会将.+?
更改为((?!xyz).)+
。通过将负前瞻置于重复组中,我们可以匹配任意数量的字符,但如果遇到xyz
则停止,因此((?!xyz).)+
将匹配“fooxyz”中的“foo”。这允许我们确保xyz
永远不会与正则表达式的第一部分匹配,因此如果它存在,则它必须位于正则表达式的(xyz)?tip
部分。
答案 1 :(得分: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 $&.
答案 2 :(得分:0)
您可以使用:
^(?>[^ ]++| (?!xyz))+ (?:xyz)?tip$