按空格分割字符串,忽略转义的空格。

4

我一直在使用百分比字符串字面量将像"one two three four\ five"这样的字符串转换为数组。

%w(one two three four\ five)

返回值:

["one", "two", "three", "four five"]

现在我想动态地做这件事,所以不能再使用 Literals 了。

哪个正则表达式模式可以将上面的字符串转换为数组?

我正在寻找一个正则表达式模式,可以放入 Ruby 的 split 方法中,将 "one two three four\ five" 转换成 ["one", "two", "three", "four five"]

注意:我只想按照未转义的空格进行拆分,就像上面一样。 因为空格被转义而结合在一起的 Four 和 Five 是同一个字符串。


请点击这里 - Wiktor Stribiżew
@WiktorStribiżew 的建议是正确的。在这里尝试一下:http://rubular.com/r/NPxmm8PfqB - mrlew
@WiktorStribiżew 您的示例确实有效,抱歉,我使用了双引号("")而不是单引号 - 是我的问题! - Dol
不,如果你匹配它,它将成为匹配的一部分。 - Wiktor Stribiżew
这是一个重复的,发现得好 - 原始内容也很新。我会相应地进行排序。 - Dol
显示剩余4条评论
3个回答

2
如果您的字符串没有转义序列,可以使用分割方法来处理,使用以下代码:
.split(/(?<!\\)\s+/)

这里的(?<!\\)\s+匹配不以\为前缀的1个或多个空白符 (\s+)。
如果你的字符串可能包含转义序列,应该优先选择匹配方法,因为它更可靠。
.scan(/(?:[^\\\s]|\\.)+/)

请查看Ruby演示
它将匹配一个或多个字符,除了\和空格(使用[^\\\s]),以及任何转义序列(使用\\.,反斜杠+除换行符之外的任意字符)。
要去除\符号,您需要稍后使用gsub

2

试试这个

require 'shellwords'

'one two three four\ five'.shellsplit
# => ["one", "two", "three", "four five"]

无需正则表达式。

这太棒了!谢谢。 - Dol

1
你可以尝试这个:

(?<!\\)\s+

Explanation

sample:

a='one two three four\ five';
b=a.split(/(?<!\\)\s+/);
print(b);

在这里运行


谢谢提供示例 :) - Dol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接