在clojure重新模式中打开/关闭贪婪

cla*_*laj 5 regex clojure

如何在clojure重新模式中打开/关闭贪婪?

(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello-world" "you"]
Run Code Online (Sandbox Code Playgroud)

VS

(re-find #"(.+)-(.+)" "hello-world-you") => ["hello-world-you" "hello" "world-you"]
Run Code Online (Sandbox Code Playgroud)

Bri*_*and 18

?品牌量词,如+,非贪婪.默认情况下,它们是贪婪的.

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

顺便说一句,这只是直接,简单和重点的答案.@ fge的回答表明了更好的方法.检查出未来的表达方式.


fge*_*fge 12

不要使用.+,使用补充的角色类:这可以避免必须关心贪婪.

你应该把它用作正则表达式:([^-]+)-([^-]+).

始终尽力确保您的输入合格.在这里,你希望匹配一次或多次不是短划线的所有内容,然后捕获它(([^-]+)),然后是破折号(-),然后(再次)捕获所有不是破折号的东西,一次或多次,并捕获它(([^-]+)).

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