ruby和使用正则表达式拆分字符串



我有一个字符串像

"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

演示

最新更新