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 に答える