2012-06-27 7 views
5

質問は簡単です。私は、単一引用符内に埋め込まれている複数の要素を含む文字列があります。引用符付きの文字列を解析する簡単な正規表現

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アプリケーションでは重要です。

私は、次の質問を見てきましたが、彼らは私の答えではありません。

答えて

8

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

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

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

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

[EDIT] - 他の回答が言うように、あなたの代わりにsplit()を使用することができますが、あなたが頼ることができる場合にのみ、あなたの文字列の各トークンの間には常にスペース(またはいくつかの共通の区切り文字)があります。

0

片道;正規表現オブジェクトはglobalフラグが設定されている場合

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

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

for (var k in result) { 
    alert(k); 
} 
1

、あなたはそれがすべての一致を検索した文字列に対して複数回実行することができます。これは、前回の実行にマッチした最後の文字の後に次の検索を開始することで動作します。

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

は個人的に、私はそれ文字列を解析するために本当に良い方法を見つけます。

EDIT:単一引用符の間の任意のコンテンツを一致/'(.*?)'/g式( ')、修飾子*?は、非貪欲であり、それは非常にパターンを単純化します。

1

異なるアプローチ

私が反応したりリアクトのためにそれらの周りに包まれた特定のタグで出力して、その後、引用符と非引用符の順序を保存、引用符と非引用符のための文字列を解析できたアプローチを必要とするここに来ましたネイティブなので私はここで答えを使用しないでいました。なぜなら、私のニーズに合うようにする方法がわからないからです。

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/

関連する問題