web-dev-qa-db-ja.com

javascriptは文字列をスペースで分割しますが、引用符で囲まれたスペースは無視します(コロンでも分割しないように注意してください)

引用符式内のスペースを無視して、JavaScriptの文字列をスペース( "")で分割するのに助けが必要です。

私はこの文字列を持っています:

var str = 'Time:"Last 7 Days" Time:"Last 30 Days"';

文字列が2に分割されることを期待します。

['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

しかし、私のコードは4に分割されます。

['Time:', '"Last 7 Days"', 'Time:', '"Last 30 Days"']

これは私のコードです:

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

ありがとう!

27
Elad Kolberg
s = 'Time:"Last 7 Days" Time:"Last 30 Days"'
s.match(/(?:[^\s"]+|"[^"]*")+/g) 

// -> ['Time:"Last 7 Days"', 'Time:"Last 30 Days"']

説明:

(?:         # non-capturing group
  [^\s"]+   # anything that's not a space or a double-quote
  |         #   or…
  "         # opening double-quote
    [^"]*   # …followed by zero or more chacacters that are not a double-quote
  "         # …closing double-quote
)+          # each match is one or more of the things described in the group

結局のところ、元の式を修正するには、グループに+を追加するだけです。

str.match(/(".*?"|[^"\s]+)+(?=\s*|\s*$)/g)
#                         ^ here.
65
kch

ES6ソリューションのサポート:

  • 内側の引用符を除いてスペースで分割
  • 引用符を削除しますが、バックスラッシュでエスケープされた引用符は削除しません
  • エスケープされた引用符は引用符になります

コード:

str.match(/\\?.|^$/g).reduce((p, c) => {
        if(c === '"'){
            p.quote ^= 1;
        }else if(!p.quote && c === ' '){
            p.a.Push('');
        }else{
            p.a[p.a.length-1] += c.replace(/\\(.)/,"$1");
        }
        return  p;
    }, {a: ['']}).a

出力:

[ 'Time:Last 7 Days', 'Time:Last 30 Days' ]
1
Tsuneo Yoshioka