2014-09-10 100 views
2

我的问题是关于函数clojure.string/split。人们可以指定分割为函数的最大数量,它就像一个魅力:分割字符串与结束的正则表达式

user> (clojure.string/split "1{1,2{3,4},5}6" #"\{" 2) 
;; => ["1" "1,2{3,4},5}6"] 

然而,函数遍历由左到右的字符串。有时我希望它从右到左遍历一个字符串形式(从结尾):

user> (clojure.string/split "1{1,2{3,4},5}6" #"\}" 2) 
;; => ["1{1,2{3,4" ",5}6"] 
;; desired result: ["1{1,2{3,4},5" "6"] 

如何使用正则表达式实现它?

回答

1

你可以尝试使用你的具体情况负前瞻,以确保有一前一后没有更多}你在分裂:

user> (clojure.string/split "1{1,2{3,4},5}6" #"\}(?![^\}]*\})" 2) 

(?![^\}]*\})是负先行,将防止匹配,如果在}匹配后还有另一个}。我使用的是否定类[^\}]*使它比使用.*更快,因为我不熟悉clojure,所以我不完全确定是否需要逃跑。通常情况下,您可以安全地使用\}(?![^}]*\}),但无论是否需要转义都可以使用。

+0

哇,它的工作原理,但我不明白如何:-(你说你正在使用'否定班',使其更快,你可以发布更慢,更简单的变种(只是开始挖掘)。转义字符,因为clojure使用[java正则表达式](http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html)并且没有它clojure抛出'PatternSyntaxException'。 – Mark 2014-09-10 12:35:11

+1

@Mark速度的差异并没有太大的不同,但是这里是:'#“\}(?!。*?\})”'负向预测的工作方式是,如果内部匹配,匹配失败。 '。*?\}'匹配时,匹配将失败,'。*?'将匹配任何*字符,但它一次检查一个字符,这更适用于字符串较短的情况。 \}(?!。* \})“'(没有'?')会做同样的事情,除非这个函数在最后一个'}接近字符串末尾时工作,并且如果th两个'}'在一个很长的字符串的开头。 ''[^ \}] *'在任何情况下都可以快速工作。 – Jerry 2014-09-10 12:48:10

+0

关于转义,我说过,因为包含Java的大多数引擎在将元字符放入字符类时不需要转义,因此:'[\}]'与'[}]'相同。但是有太多的东西在那里,一个永远不能太确定:) – Jerry 2014-09-10 12:49:43