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

ruby and splitting strings with regex

我有一个像

这样的字符串
"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(/(?:\[[^\]\[]*\]|[^;])+/)

详情:

  • (?: - non-capturing 组的开始:
    • \[ - 一个 [ 字符
    • [^\]\[]* - []
    • 以外的零个或多个字符
    • \] - 一个 ] 字符
  • | - 或者
    • [^;] - 除了 ; 字符
    • 之外的任何单个字符
  • )+ - 小组结束,重复一次或多次。

参见 Ruby demo:

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]"]

Demo

正则表达式可以分解如下

;           # match ';'
(?!         # begin negative lookahead
  [^\[\]]*  # match >= chars other than '[' and ']'
  \]        # match ']'
)           # end negative lookahead

可以使用以下正则表达式来确认括号匹配且不重叠。

\A[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*[^\[\]]*\z

Demo