2012-01-12 62 views
5

如何打开/关闭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"] 

回答

15

使得?量词,如+,非贪婪。默认情况下,它们很贪婪。

  • 贪婪:(.+)
  • 非贪婪:(.+?)

顺便说一句,这仅仅是直接,简单,到了点答案。 @ fge的回答建议更好这样做。检查它未来的表达式。

12

请勿使用.+,请使用补充的字符类:这样可以避免必须关心贪婪。

你应该使用这个作为正则表达式:([^-]+)-([^-]+)

始终努力尽可能地限定您的输入。在这里,你想匹配所有不是破折号的东西,一次或多次,并捕获它(([^-]+)),然后破折号(-),然后(再次)所有不是破折号的一次或多次,并捕获它(([^-]+) )。

如果你知道你可以描述你的输入没有依赖它,依靠量词的(非)贪婪是一个根本性的错误。不仅它是错误的根源(正如你自己演示的那样),它也是正则表达式引擎以最高效率执行的障碍。

+0

真的,懒惰的表情是为懒惰的人。但是,如果我们不懒惰,我们将使用字符数组和'for循环,而不是使用正则表达式。 – FakeRainBrigand 2012-01-13 02:26:41

+1

这不是问题。这只是坏的正则表达式的做法。我知道有85%以上的正则表达式网站会推荐它,但这85 +%的网站只是_wrong_。 – fge 2012-01-13 10:13:09

+0

(+1)我同意。我更新了我的答案。 – FakeRainBrigand 2012-01-13 12:58:16