为什么延迟匹配比它似乎需要更多,这里?

时间:2014-07-28 22:56:36

标签: regex intellij-idea

enter image description here

我在字符串".*?Model"上搜索"id": "FooModel"。由于我使用了延迟匹配,因此我希望它与"FooModel"匹配,但它匹配整个字符串。为什么会发生这种情况,我如何得到我想要的东西?

3 个答案:

答案 0 :(得分:3)

对最短匹配的误解

在延迟匹配的上下文中,“最短匹配”是当前匹配尝试中延迟量词可用的最短匹配。

引擎尝试在字符串中的第一个位置进行第一次匹配。从那里,它尝试匹配模式.*?Model。这个位置有比赛吗?是。从这个位置开始,最短的匹配是整个字符串。

如果您只想匹配FooModel,可以举例\w+Model[a-zA-Z]+Model

答案 1 :(得分:3)

.*?是懒惰的,但正则表达式引擎贪婪地开始搜索 - 也就是说,它尝试在字符串的开头匹配,然后仅在失败时尝试匹配下一个位置,然后是下一个位置,等等。由于匹配在字符串开头处成功,因此它永远不会尝试以后的位置。

您需要从.

中排除引号
"[^"]*Model"

如果您想允许转义序列如\"

,这会稍微复杂一些
"(?:[^"]|\\.)*Model"

答案 2 :(得分:3)

你的正则表达式确实匹配整个字符串,因为第一个匹配是引用引号。

试试这个:

 (?<=")[^"]*Model(?=")

&#34的否定字符类;不是引用&#34;防止匹配包含引号(并且意味着你不需要不情愿的量词&#34;?&#34;)。环视是非捕捉的,所以整场比赛都是你的目标。