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]"]
正则表达式可以分解如下
; # match ';'
(?! # begin negative lookahead
[^\[\]]* # match >= chars other than '[' and ']'
\] # match ']'
) # end negative lookahead
可以使用以下正则表达式来确认括号匹配且不重叠。
\A[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*[^\[\]]*\z
我有一个像
这样的字符串"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]"]
正则表达式可以分解如下
; # match ';'
(?! # begin negative lookahead
[^\[\]]* # match >= chars other than '[' and ']'
\] # match ']'
) # end negative lookahead
可以使用以下正则表达式来确认括号匹配且不重叠。
\A[^\[\]]*(?:\[[^\[\]]*\][^\[\]]*)*[^\[\]]*\z