【发布时间】:2014-04-25 22:36:20
【问题描述】:
我正在使用 javascript 中的正则表达式。
我有这个正则表达式:/\/.+?$/
还有这个字符串:/path/to/file
我希望得到/file 的结果,但我却得到了整个字符串。我在这里不明白什么? ? 应该使 + 非贪婪,这意味着它将匹配尽可能少的字符。
【问题讨论】:
标签: javascript regex regex-greedy
我正在使用 javascript 中的正则表达式。
我有这个正则表达式:/\/.+?$/
还有这个字符串:/path/to/file
我希望得到/file 的结果,但我却得到了整个字符串。我在这里不明白什么? ? 应该使 + 非贪婪,这意味着它将匹配尽可能少的字符。
【问题讨论】:
标签: javascript regex regex-greedy
正则表达式总是会尝试从左到右匹配。即使.+? 是非贪婪的,正则表达式仍会在可能的情况下尝试从字符串的开头进行匹配,并且仅在匹配失败时推进起始位置。
你有几个选项来解决这个问题:
/.*(\/.+?)$/,然后您将获得/file 作为第一个捕获组中的内容。.+? 无法匹配任何其他/,因此它将是/\/[^\/]+$/。【讨论】:
您可以根据需要使用否定:
'/path/to/file'.match(/\/[^/]+$/);
//=> ["/file"]
您的正则表达式/\/.+?$/ 匹配第一个斜杠,然后使用.+? 匹配输入的其余部分,因为.+? 后面没有任何内容。
如果您使用:/\/.+?\/$/,您会看到不同的行为,它将不情愿地表现并匹配/path/。
【讨论】:
表达式末尾的$ 强制进行字符串结尾匹配。这样做的唯一方法是抓取整个字符串,不管是否贪婪。
但是,即使 没有 $,您的正则表达式也存在缺陷。 /\/.+?/ 将只匹配一个字符,其中整个字符串由/\/.+/ 匹配。您根本没有指定任何约束。
要只抓取第一部分,直到 -- 但不包括 -- 下一个斜杠,请使用:
/\/.[^\/]*/
【讨论】:
/\/.+?/ 不会匹配整个字符串,而只会匹配/p。