Clojure 用于对列表项进行常规匹配的正则表达式样式匹配库
我以前见过这样的图书馆,但后来忘了它叫什么了 您可以指定与列表中的元素相匹配的模式,例如:Clojure 用于对列表项进行常规匹配的正则表达式样式匹配库,clojure,Clojure,我以前见过这样的图书馆,但后来忘了它叫什么了 您可以指定与列表中的元素相匹配的模式,例如: (def oddsandevens (pattern (n-of odd? :*) (n-of even? 2) :$)) (pattern-match oddsandevens [1 1 2 2]) => true (pattern-match oddsandevens [1 1 1 2 2]) => true (pattern-match oddsandevens [1 1 2 2 2
(def oddsandevens (pattern (n-of odd? :*) (n-of even? 2) :$))
(pattern-match oddsandevens [1 1 2 2]) => true
(pattern-match oddsandevens [1 1 1 2 2]) => true
(pattern-match oddsandevens [1 1 2 2 2]) => false
(pattern-match oddsandevens [1 1 2]) => false
如果我完全是在想象,有人能解释一下如何写这些东西吗?评论太长了: 如果你想自己发展,你可能会发现Brzowski的文章很有用。它描述了一种将正则表达式转换为能够识别它的状态机的有效技术。另一个来源是约翰·康威的书 我有一种感觉,@leontalbot发现,已经完成了这项工作,但由于我手头没有合适的开发环境,我无法进行调查。虽然他的终端类是字符串,但他为正则表达式定义了一个协议,他的并集和序列(以及stars?)都遵守该协议 环顾其他语言
- Scala做了Clojure做的事情:包装Java正则表达式 Boost有一些C++的东西。现在还不清楚它是否 要求终端为字符
补充说明:
- 关于谷歌集团的文章值得一读
- Russ Cox收集了一些可能比上述更有用的参考资料
- 他在自己的文章中描述的技术,在谷歌集团中提到
线程,看起来自然的Clojure李>
(def odds-and-evens (>> (many (token odd?)) (times 2 (token even?))))
和测试
(matches? odds-and-evens [1 1 2 2]) ;=> true
(matches? odds-and-evens [1 1 1 2 2]) ;=> true
(matches? odds-and-evens [1 1 2 2 2]) ;=> false
(matches? odds-and-evens [1 1 2]) ;=> false
从这里,您可以添加sugar来指定所需的模式。这里是GitHub上clojure中的regex项目,希望它能帮助您找到您的库!这可能会有帮助。您可能会使用回溯状态monad来解析序列。我并没有尝试过(甚至不知道回溯状态monad是什么),但它看起来很有趣,也很相关。或者这个库正是我想要的。谢谢@awebb谢谢你的总结。我真想有一天自己写一本。。这些链接将非常有用!
(matches? odds-and-evens [1 1 2 2]) ;=> true
(matches? odds-and-evens [1 1 1 2 2]) ;=> true
(matches? odds-and-evens [1 1 2 2 2]) ;=> false
(matches? odds-and-evens [1 1 2]) ;=> false