如何打开/关闭clojure重新模式中的贪婪?打开/关闭clojure重新模式中的贪婪
(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello-world" "you"]
VS
(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello" "world-you"]
如何打开/关闭clojure重新模式中的贪婪?打开/关闭clojure重新模式中的贪婪
(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello-world" "you"]
VS
(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello" "world-you"]
使得?
量词,如+
,非贪婪。默认情况下,它们很贪婪。
(.+)
(.+?)
顺便说一句,这仅仅是直接,简单,到了点答案。 @ fge的回答建议更好这样做。检查它未来的表达式。
请勿使用.+
,请使用补充的字符类:这样可以避免必须关心贪婪。
你应该使用这个作为正则表达式:([^-]+)-([^-]+)
。
始终努力尽可能地限定您的输入。在这里,你想匹配所有不是破折号的东西,一次或多次,并捕获它(([^-]+)
),然后破折号(-
),然后(再次)所有不是破折号的一次或多次,并捕获它(([^-]+)
)。
如果你知道你可以描述你的输入没有依赖它,依靠量词的(非)贪婪是一个根本性的错误。不仅它是错误的根源(正如你自己演示的那样),它也是正则表达式引擎以最高效率执行的障碍。
真的,懒惰的表情是为懒惰的人。但是,如果我们不懒惰,我们将使用字符数组和'for循环,而不是使用正则表达式。 – FakeRainBrigand 2012-01-13 02:26:41
这不是问题。这只是坏的正则表达式的做法。我知道有85%以上的正则表达式网站会推荐它,但这85 +%的网站只是_wrong_。 – fge 2012-01-13 10:13:09
(+1)我同意。我更新了我的答案。 – FakeRainBrigand 2012-01-13 12:58:16