拆分空格避免使用双引号JS字符串:来自' a" b \\" C" d'到[' a','" b \\" C"'' d']

时间:2014-06-05 20:09:38

标签: javascript regex json command command-line-arguments

我目前正在为自定义文件格式构建一个小文本编辑器。我有一个GUI,但我也实现了一个小输出控制台。我想要实现的是添加一个非常基本的输入字段来执行一些命令并传递参数。 命令看起来像:

compile test.json output.bin -location "Paris, France" -author "Charles \"Demurgos\""

我的问题是获取一个包含以空格分隔的参数的数组,但是保留双引号部分,这些部分可能是由JSON.stringify生成的包含内部转义双引号的字符串。

要清楚,上一个命令的预期数组是:

[
    'compile',
    'test.json',
    'output.bin',
    '-location',
    '"Paris, France"',
    '-author',
    '"Charles \\"Demurgos\\""'
]

然后我可以迭代这个数组并应用JSON.parse if indexOf('"') == 0来获得最终结果:

[
    'compile',
    'test.json',
    'output.bin',
    '-location',
    'Paris, France',
    '-author',
    'Charles "Demurgos"'
]

感谢这个问题:Split a string by commas but ignore commas within double-quotes using Javascript。如果参数不包含任何双引号,我就能得到我需要的东西。这是我得到的正则表达式:

/(".*?"|[^"\s]+)(?=\s*|\s*$)/g

但它遇到双引号时会退出当前参数,即使它已被转义。如何调整此RegEx以处理转义或非双引号?如果我提示action "windowsDirectory\\" otherArg边缘情况怎么样,这里反斜杠已经被转义,所以即使它后跟双引号,它也应该退出参数。 这是我在之前的项目中尽可能避免的问题,但我觉得是时候学习如何正确地使用帐户以外的转义字符了。

这是一个JS-Fiddle:http://jsfiddle.net/GwY8Y/1/ 您可以看到开头是经过良好分析的,但最后一个参数是拆分和错误。

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

此正则表达式将为您提供所需的字符串(请参阅demo):

"(?:\\"|\\\\|[^"])*"|\S+

像这样使用:

your_array = subject.match(/"(?:\\"|\\\\|[^"])*"|\S+/g);

解释正则表达式

"                        # '"'
(?:                      # group, but do not capture (0 or more times
                         # (matching the most amount possible)):
  \\                     #   '\'
  "                      #   '"'
 |                       #  OR
  \\\\                   #   two backslashes
 |                       #  OR
  [^"]                   #   any character except: '"'
)*                       # end of grouping
"                        # '"'
|                        # OR
\S+                      # non-whitespace (all but \n, \r, \t, \f,
                         # and " ") (1 or more times (matching the
                         # most amount possible))