正则表达式用空格分组引号分割

时间:2012-05-10 08:50:44

标签: javascript regex

我试图在JS中拆分字符串,如...

'a b c' => ['a','b','c']
'a bb cc dd' => ['a','bb','cc','dd]
'a "bb cc" dd' => ['a','bb cc', 'dd']
"a 'bb cc' dd" => ['a','bb cc', 'dd']

我如何在JS regexp中执行此操作? 我试过了

/\w+|"(?:\\"|[^"])+"/g

但它返回......

'a b c' => ['a','b','c']
'a bb cc dd' => ['a','bb','cc','dd]
'a "bb cc" dd' => ['a','"bb cc"', 'dd']
"a 'bb cc' dd" => ['a','bb','cc', 'dd']

1 个答案:

答案 0 :(得分:1)

假设您有一个字符串:

var s = "a b c 'd e f' g \"h i j\" k";

您可以使用以下方式轻松匹配令牌:

/"[^"]*"|'[^']*'|\S+/g

那种模式:

  • 匹配用双引号括起来的字符串,或者......
  • 匹配用单引号括起来的字符串,或者......
  • 匹配非空格。

然而,结果标记将用引号括起来 以下是删除这些引号的示例:

var words = [];
s.replace(/"([^"]*)"|'([^']*)'|(\S+)/g,
         function(g0,g1,g2,g3){
              words.push(g1 || g2 || g3 || '');
         });

这有一些技巧,但我们的想法是我们选择非空的组(这是一个假的值是JavaScript)。您可以使用exec实现相同的目标,但我认为代码更加混乱。

工作示例:http://jsfiddle.net/snS62/(警告 - 提醒)

要同时允许转义字符,您可以使用:

/"([^\\"]*(?:\\.[^\\"]*)*)"|'([^\\']*(?:\\.[^\\']*)*)'|(\S+)/g