我想拆分这样的字符串:
my_string = "I want to split this (these should stay together) correctly"
并得到以下结果:
["I", "want", "to", "split", "this", "(these should stay together)", "correctly"]
我试过了:
my_string.split(/(?=[^\(]){1,} (?=[^\)]){1,}/)
但是圆括号内的元素是分开的。我怎样才能做到这一点?
答案 0 :(得分:6)
split
是错误的工具。使用scan
。
my_string.scan(/\([^)]*\)|\S+/)
# => ["I", "want", "to", "split", "this", "(these should stay together)", "correctly"]
如果平衡括号可以与你想要放在一起的其他非空格字符相邻,那么你可能想要这个,这更常用:
my_string.scan(/(?:\([^)]*\)|\S)+/)
通常,当分隔符可以用简单模式表示时,请使用split
。如果内容可以用简单的模式表示,请使用scan
。
答案 1 :(得分:2)
可能需要分两步完成,以保持正则表达式简单:
first, middle, last = my_string.partition /\(.*\)/
[*first.split, middle, *last.split]
#=> ["I", "want", "to", "split", "this", "(these should stay together)",
# "correctly"]
另一个例子:
first, middle, last = "x (x(x(x)x)x) x".partition /\(.*\)/
[*first.split, middle, *last.split]
#=> ["x", "(x(x(x)x)x)", x"]
但它在这里失败了:
first, middle, last = "x (x)x(x) x".partition /\(.*\)/
[*first.split, middle, *last.split]
#=> [ "x, "(x)x(x)", "x"]
假设需要["x", "(x)", "x", "(x)", "x"]
。
答案 2 :(得分:2)
只是为了好奇:
my_string.gsub(/\(.+?\)/) { |m| m.gsub ' ', ' ' }.split(/ +/)
尝试将上面的代码复制粘贴到IRB中并继续关注:
#⇒ ["I", "want", "to", "split", "this",
# "(these should stay together)", "correctly"]
:)
NB 这是一个笑话,请不要在制作中使用它。
正如@sawa建议的那样,它有点逃避,因此,为了使这个答案正确,人们应该将所有内容转换回普通空间:
my_string.gsub(/\(.+?\)/) { |m| m.gsub ' ', ' ' }
.split(/ +/)
.gsub ' ', ' '
答案 3 :(得分:0)
您可以使用此正则表达式split
:
/ +(?![^()]*\))/
即
my_string.split(/ +(?![^()]*\))/)
(?![^()]*\))
是否定前瞻,这意味着如果后面跟着一个0或更多的非括号字符,后跟右括号,则不匹配空格,因此不匹配空格在(...)
内。