7

質問は簡単です。一重引用符で囲まれた複数の要素を含む文字列があります。

var str = "'alice'   'anna marie' 'benjamin' 'christin'     'david' 'muhammad ali'"

そして、それらすべての名前が配列に含まれるように解析したいと思います。

result = [
 'alice',
 'anna marie',
 'benjamin',
 'christin',
 'david',
 'muhammad ali'
]

現在、私はこのコードを使用して仕事をしています:

var result = str.match(/\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'\s*'(.*?)'/);

ただし、この正規表現は長すぎて柔軟性がないため、str文字列に要素が多い場合は、正規表現を編集する必要があります。

この解析を行うための最速かつ最も効率的な方法は何ですか?Webアプリケーションでは、パフォーマンスと柔軟性が重要です。

私は次の質問を見ましたが、それらは私の答えではありません:

4

5 に答える 5

10

パターンを一度定義し、グローバルgフラグを使用します。

var matches = str.match(/'[^']*'/g);

一重引用符なしでトークンが必要な場合、通常のアプローチはREGEXでサブマッチを使用することですが、JavaScriptは、gフラグが使用されている場合のサブグループのキャプチャをサポートしていません。これを回避する最も簡単な(必ずしも最も効率的ではありませんが)方法は、後でそれらを繰り返し削除することです。

if (matches)
    for (var i=0, len=matches.length; i<len; i++)
        matches[i] = matches[i].replace(/'/g, '');

[編集]-他の回答が言うようsplit()に、代わりに使用できますが、文字列内の各トークンの間に常にスペース(またはいくつかの一般的な区切り文字)があることに依存できる場合に限ります。

于 2012-06-27T13:38:25.773 に答える
1

正規表現オブジェクトにglobalフラグが設定されている場合、文字列に対して複数回実行して、すべての一致を見つけることができます。これは、最後の実行で一致した最後の文字の後に次の検索を開始することによって機能します。

var buf = "'abc' 'def' 'ghi'";
var exp = /'(.*?)'/g;
for(var match=exp.exec(buf); match!=null; match=exp.exec(buf)) {
  alert(match[0]);
}

個人的には、文字列を解析するのに非常に良い方法だと思います。

編集:/'(.*?)'/gは一重引用符(')の間の任意のコンテンツに一致し、修飾子*?は貪欲ではなく、パターンを大幅に簡素化します。

于 2012-06-27T14:03:23.530 に答える
1

別のアプローチ

引用符と非引用符の文字列を解析し、引用符と非引用符の順序を保持し、ReactまたはReact Native用に特定のタグをラップして出力できるアプローチが必要なため、ここで回答を使用しませんでした。それらを自分のニーズに合わせる方法がわからなかったので、代わりにこれを行いました。

function parseQuotes(str) {
  var openQuote = false;
  var parsed = [];
  var quote = '';
  var text = '';
  var openQuote = false;

  for (var i = 0; i < str.length; i++) {
    var item = str[i];
    if (item === '"' && !openQuote) {
      openQuote = true;
      parsed.push({ type: 'text', value: text });
      text = '';
    }
    else if (item === '"' && openQuote) {
      openQuote = false;
      parsed.push({ type: 'quote', value: quote });
      quote = '';
    }
    else if (openQuote) quote += item;
    else text += item;  
  }

  if (openQuote) parsed.push({ type: 'text', value: '"' + quote });
  else parsed.push({ type: 'text', value: text });

  return parsed;
}

これを与えられたとき:

'Testing this "shhhh" if it "works!" " hahahah!'

それを生成します:

[
  {
    "type": "text",
    "value": "Testing this "
  },
  {
    "type": "quote",
    "value": "shhhh"
  },
  {
    "type": "text",
    "value": " if it "
  },
  {
    "type": "quote",
    "value": "works!"
  },
  {
    "type": "text",
    "value": " "
  },
  {
    "type": "text",
    "value": "\" hahahah!"
  }
]

これにより、タグを簡単にラップすることができます。

https://jsfiddle.net/o6seau4e/4/

于 2017-02-26T19:24:11.923 に答える
0

一方通行;

var str = "'alice' 'benjamin' 'christin' 'david'";
var result = {};

str.replace(/'([^']*)'/g, function(m, p1) {
    result[p1] = "";
});

for (var k in result) {
    alert(k);
}
于 2012-06-27T13:45:25.063 に答える
0

誰かがここに来て、一重引用符または二重引用符の両方と引用符をエスケープする機能を備えた、より複雑な文字列解析が必要な場合、これは正規表現です。JSとRubyでテスト済み。

r = /(['"])((?:\\\1|(?!\1).)*)(\1)/g
str = "'alice'  ddd vvv-12 'an\"na m\\'arie' \"hello ' world\" \"hello \\\" world\" 'david' 'muhammad ali'"
console.log(str.match(r).join("\n"))
  'alice'
  'an"na m\'arie'
  "hello ' world"
  "hello \" world"
  'david'
  'muhammad ali'

引用符で囲まれていない文字列が見つからなかったことを確認してください。目標が引用符で囲まれていない単語も見つけることである場合は、小さな修正で次のようになります。

r = /(['"])((?:\\\1|(?!\1).)*)(\1)|([^'" ]+)/g
console.log(str.match(r).join("\n"))
  'alice'
  ddd
  vvv-12
  'an"na m\'arie'
  "hello ' world"
  "hello \" world"
  'david'
  'muhammad ali'
于 2022-01-19T17:02:29.053 に答える