Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 用于对列表项进行常规匹配的正则表达式样式匹配库_Clojure - Fatal编程技术网

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
更一般地说,您需要一种表达方式来解析序列。Clojure当然有很多解析库,但其中很多都是通过解析进行词法分析的(从优化性能的角度来看,这可能有很好的原因),因此只能用于字符串。您可能需要从外部查找,以找到允许将词法分析作为单独关注点的解析器

例如,(重量仅为262磅)

现在定义您的模式

(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