Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Regex 从末尾用正则表达式拆分字符串_Regex_String_Clojure - Fatal编程技术网

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)