正则表达式在空格上分裂但没有转义空格

时间:2017-01-10 22:01:25

标签: ruby regex

我想拆分标准空格" "但不转义空格" \"

例如,使用字符串'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"
]

3 个答案:

答案 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'的字符类

(?![\\])这告诉正则表达式引擎匹配一个前面带有反斜杠“\”的空格(在这里用另一个反斜杠转义)