正则表达式可选前瞻

时间:2011-09-09 11:32:16

标签: regex

我想要一个正则表达式来匹配所有这些:

  1. startabcend
  2. startdef
  3. blahstartghiend
  4. blahstartjklendsomething
  5. 并分别返回abcdefghijkl

    我有以下内容适用于案例1和案例3,但我在查找前瞻时遇到了麻烦。

    (?<=start).*(?=end.*)
    

    修改

    嗯。不好的例子。实际上,中间的位不是数字,而是先于一组特定的字符,并且可选地由它继续。我已根据要求更新了输入和输出,并添加了第4个示例以回应某些问题。

6 个答案:

答案 0 :(得分:10)

试着在各行之间阅读,看起来好像你不想在这里预见,你实际上想要非贪婪的.*?

(?<=start).*?(?:end)?$

我的猜测是,您尝试匹配"start123end"之类的内容,但不希望endstart显示在匹配的文本中,因此你有那里的外观断言来约束通常贪婪的.*

相反,您可以使用非贪婪变体,并使用$将模式的右端锚定。

(或者,如果你能够使用捕获组,你应该这样做:

start(.*?)(end)?$

然后从第一个捕获组中获取值。)

答案 1 :(得分:10)

也许是这样的:

(?<=start).*?(?=(?:end|$))

这将匹配到“开始”和“结束”或直到行尾,此外量词必须是非贪心的(.*?

here on Regexr

将Regexr上的示例扩展为不仅使用数字。

答案 2 :(得分:2)

单凭Lookahead将无法完成这项工作。试试这个:

(?<=start)(?:(?!end).)*

在“开始”这个词后面的后方位置,然后其余部分消耗所有内容直到(但不包括)下一次出现的“结束”。

这是 demo on Ideone.com

答案 3 :(得分:1)

可选的前瞻没有意义:

如果它是可选的,那么如果它匹配就没关系,但是如果它不匹配也没关系。由于前瞻不会延长匹配,因此绝对没有效果。

因此可选前瞻的语法是空字符串。

答案 4 :(得分:1)

如果“end”总是存在,那么使用: 当你输入OP时(?<=start)(.*?)(?=end)。既然你说“使前瞻可选”,那么只需运行直到“结束”或回车。 (?<=start)(.*?)(?=end|\n)。如果您不关心捕获“结束”组,您可以跳过前瞻,并执行(?:start)?(.*?)(?:end)?,它将在“开始”之后开始,如果它在那里并在“结束”之前停止,如果它在那里。您还可以使用更多管道“或”模式:(?:start|^)(?:end|\n)

答案 5 :(得分:-1)

为什么需要前瞻?

start(\d+)\w*

rubular

上查看