我想拆分标准空格" "
但不转义空格" \"
例如,使用字符串'my name\ is\ max'
(单引号使\
为文字)
我想获得["my", "name\ is\ max"]
我试过这个正则表达式:/[^\\]\s/
但结果如下:
=> ["m", "name\\ is\\ max"]
这很接近,但我不知道如何将y
保留在my
修改的
另一个例子考虑这个字符串:
"./db/users/WGDl-HATof-uhdtT7sPfog: email=maxpleaner@gmail.com name=max\\ p"
我想把它分成三个:
[
"./db/users/WGDl-HATof-uhdtT7sPfog:",
"email=maxpleaner@gmail.com",
"name=max\\ p"
]
答案 0 :(得分:3)
关于
我试图拆分没有反斜杠的空格。
如果您只关心空白之前的反斜杠并且没有其他特殊情况需要考虑,请在(?<!\\)
之前使用负面的lookbehind \s
:
s.split(/(?<!\\)\s/)
此处,\s+
匹配1 +空格,如果没有前面带有反斜杠((?<!\\)
是负向后看,它会检查当前位置左侧的文本是否匹配模式,如果是,则匹配失败)。
如果需要考虑多个空格,并且需要处理转义序列,请使用
s.scan(/(?:[^\s\\]|\\.)+/)
请参阅Ruby demo
此处,(?:[^\s\\]|\\.)+
匹配除反斜杠和空格([^\s\\]
)或任何转义序列(\\.
)之外的1个或多个字符。添加/m
修饰符也可以使.
匹配换行符。
答案 1 :(得分:3)
试试这个
require 'shellwords'
'my name\ is\ max'.shellsplit
# => ["my", "name is max"]
无需正则表达式。
答案 2 :(得分:1)
试试这个:
"./db/users/WGDl-HATof-uhdtT7sPfog: email=maxpleaner@gmail.com name=max\\ p".split(/(?<![\\])[\s](?![\\])/)
。
正则表达式的分解(?<![\\])[\s](?![\\])
:
(?<![\\])
这告诉正则表达式引擎匹配一个前面没有反斜杠“\”的空格(在这里用另一个反斜杠转义)
[\s]
这是'space'的字符类
(?![\\])
这告诉正则表达式引擎匹配一个前面带有反斜杠“\”的空格(在这里用另一个反斜杠转义)