Regex 从末尾用正则表达式拆分字符串
我的问题是关于函数Regex 从末尾用正则表达式拆分字符串,regex,string,clojure,Regex,String,Clojure,我的问题是关于函数clojure.string/split。您可以为函数指定最大拆分次数,它的工作方式就像一个符咒: user> (clojure.string/split "1{1,2{3,4},5}6" #"\{" 2) ;; => ["1" "1,2{3,4},5}6"] 但是,函数从左向右遍历字符串。有时我希望它从右向左(从末尾)遍历字符串表单: 如何使用regex实现它?您可以尝试在特定情况下使用负前瞻,以确保在拆分后不再有: user> (clojure.stri
clojure.string/split
。您可以为函数指定最大拆分次数,它的工作方式就像一个符咒:
user> (clojure.string/split "1{1,2{3,4},5}6" #"\{" 2)
;; => ["1" "1,2{3,4},5}6"]
但是,函数从左向右遍历字符串。有时我希望它从右向左(从末尾)遍历字符串表单:
如何使用regex实现它?您可以尝试在特定情况下使用负前瞻,以确保在拆分后不再有
:
user> (clojure.string/split "1{1,2{3,4},5}6" #"\}(?![^\}]*\})" 2)
(?![^\}]*\})
是一种消极的前瞻,如果在匹配的}
之后有另一个}
,则会阻止匹配。我正在使用否定类[^\}]*
使它比使用类似*
的东西更快,我不完全确定您是否需要转义,因为我不熟悉clojure。通常,您可以安全地使用\}(?![^}]*\})
,但转义将起作用,无论是否需要。哇,它起作用了,但我不明白如何:-(您说过您使用“否定类”来加快速度。您是否可以发布更慢、更简单的变体(只是为了开始挖掘).P.S.应该使用转义字符,因为clojure使用转义字符,而不使用转义字符,clojure会抛出PatternSyntaxException
@Mark速度上的差异并不大,但这里是:“\}(?.*?\}”
负前瞻的工作方式是,如果内部内容匹配,则匹配失败。因此,如果*?\}
匹配,则匹配将失败。*?
将匹配任何字符,但它一次检查一个字符。这更适合于字符串较短的实例。\}(?.*\})
(不带?
)将执行相同的操作,但当最后一个}
接近字符串末尾时,此操作有效,如果两个}
位于非常长字符串的开头,则速度可能非常慢。[^\}]*
在任何情况下都能快速工作。关于转义,我说过,因为大多数引擎(包括Java)在将元字符放入字符类时都不需要转义,所以:[\}]
与[}]
相同。但是转义的内容太多了,我们永远不能太确定:)谢谢你解释“机器”:我想了解我的代码中发生了什么。@Mark如果你需要更详细的说明,请告诉我。我在上面的评论中用完了角色。
user> (clojure.string/split "1{1,2{3,4},5}6" #"\}(?![^\}]*\})" 2)