2

我曾尝试在 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 正则表达式中做到这一点?我试过了

/\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']
4

1 回答 1

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
于 2012-05-10T09:19:37.363 回答