我在字符串".*?Model"
上搜索"id": "FooModel"
。由于我使用了延迟匹配,因此我希望它与"FooModel"
匹配,但它匹配整个字符串。为什么会发生这种情况,我如何得到我想要的东西?
答案 0 :(得分:3)
在延迟匹配的上下文中,“最短匹配”是当前匹配尝试中延迟量词可用的最短匹配。
引擎尝试在字符串中的第一个位置进行第一次匹配。从那里,它尝试匹配模式.*?Model
。这个位置有比赛吗?是。从这个位置开始,最短的匹配是整个字符串。
如果您只想匹配FooModel
,可以举例\w+Model
或[a-zA-Z]+Model
答案 1 :(得分:3)
.*?
是懒惰的,但正则表达式引擎贪婪地开始搜索 - 也就是说,它尝试在字符串的开头匹配,然后仅在失败时尝试匹配下一个位置,然后是下一个位置,等等。由于匹配在字符串开头处成功,因此它永远不会尝试以后的位置。
您需要从.
"[^"]*Model"
如果您想允许转义序列如\"
:
"(?:[^"]|\\.)*Model"
答案 2 :(得分:3)
你的正则表达式确实匹配整个字符串,因为第一个匹配是引用引号。
试试这个:
(?<=")[^"]*Model(?=")
&#34的否定字符类;不是引用&#34;防止匹配包含引号(并且意味着你不需要不情愿的量词&#34;?&#34;)。环视是非捕捉的,所以整场比赛都是你的目标。