我有一个字符串像
"A;BB;C[1;22];DDD[11;2;33];EEEEE[1111]"
我将它分割成
["A","BB","C[1;22]","DDD[11;2;33]","EEEEE[1111]"]
字符和数字代表任何长度为1-x个字符的字符串。
我的正则表达式就像
/(?<!(w+)[)(;(?!((w+)((;)(w+)){0,}])))/
https://regex101.com/r/fWNHBB/2
但是我没有让它在ruby中运行。有人能帮我一下吗?
可以使用
text.scan(/(?:[[^][]*]|[^;])+/)
细节:
(?:
-非捕获组的起始点:[
- a[
char[^][]*
-除[
和]
以外的零个或多个字符]
- a]
char
|
-或[^;]
-;
字符以外的任何单个字符
)+
-组结束,重复一次或多次。
参见Ruby演示:
text = "A;BB;C[1;22];DDD[11;2;33];EEEEE[1111]"
puts text.scan(/(?:[[^][]*]|[^;])+/)
输出:
A
BB
C[1;22]
DDD[11;2;33]
EEEEE[1111]
我假设括号是匹配的而不是重叠的。也就是说,每个左括号后跟一个右括号,中间不带左括号或右括号,每个右括号前面都后跟一个左括号,中间不带左括号或右括号。
有了这个附带条件,你可以这样做。
str = "A;BB;C[1;22];DDD[11;2;33];EEEEE[1111]"
rgx = /;(?![^[]]*])/
str.split(rgx)
#=> ["A", "BB", "C[1;22]", "DDD[11;2;33]", "EEEEE[1111]"]
演示正则表达式可以分解如下:
; # match ';'
(?! # begin negative lookahead
[^[]]* # match >= chars other than '[' and ']'
] # match ']'
) # end negative lookahead
可以使用下面的正则表达式来确认括号是否匹配且不重叠。
A[^[]]*(?:[[^[]]*][^[]]*)*[^[]]*z
演示