我想要一个正则表达式来匹配所有这些:
startabcend
startdef
blahstartghiend
blahstartjklendsomething
并分别返回abc
,def
,ghi
和jkl
。
我有以下内容适用于案例1和案例3,但我在查找前瞻时遇到了麻烦。
(?<=start).*(?=end.*)
修改
嗯。不好的例子。实际上,中间的位不是数字,而是先于一组特定的字符,并且可选地由它继续。我已根据要求更新了输入和输出,并添加了第4个示例以回应某些问题。
答案 0 :(得分:10)
试着在各行之间阅读,看起来好像你不想在这里预见,你实际上想要非贪婪的.*?
。
(?<=start).*?(?:end)?$
我的猜测是,您尝试匹配"start123end"
之类的内容,但不希望end
或start
显示在匹配的文本中,因此你有那里的外观断言来约束通常贪婪的.*
。
相反,您可以使用非贪婪变体,并使用$
将模式的右端锚定。
(或者,如果你能够使用捕获组,你应该这样做:
start(.*?)(end)?$
然后从第一个捕获组中获取值。)
答案 1 :(得分:10)
也许是这样的:
(?<=start).*?(?=(?:end|$))
这将匹配到“开始”和“结束”或直到行尾,此外量词必须是非贪心的(.*?
)
将Regexr上的示例扩展为不仅使用数字。
答案 2 :(得分:2)
单凭Lookahead将无法完成这项工作。试试这个:
(?<=start)(?:(?!end).)*
在“开始”这个词后面的后方位置,然后其余部分消耗所有内容直到(但不包括)下一次出现的“结束”。
答案 3 :(得分:1)
可选的前瞻没有意义:
如果它是可选的,那么如果它匹配就没关系,但是如果它不匹配也没关系。由于前瞻不会延长匹配,因此绝对没有效果。
因此可选前瞻的语法是空字符串。
答案 4 :(得分:1)
如果“end”总是存在,那么使用:
当你输入OP时(?<=start)(.*?)(?=end)
。既然你说“使前瞻可选”,那么只需运行直到“结束”或回车。 (?<=start)(.*?)(?=end|\n)
。如果您不关心捕获“结束”组,您可以跳过前瞻,并执行(?:start)?(.*?)(?:end)?
,它将在“开始”之后开始,如果它在那里并在“结束”之前停止,如果它在那里。您还可以使用更多管道“或”模式:(?:start|^)
和(?:end|\n)
。
答案 5 :(得分:-1)