2010-12-13 32 views
1

私は正規表現の難問plsでいくつかの助けが必要です。私はまだすべてを把握しています - 明らかに専門家ではありません!文字列を分割する複雑な正規表現

例:私はそうのような複雑な文字列があるとしましょう:すべての

{something:here}{examp.le:!/?foo|bar}BLAH|{something/else:here}:{and:here\\}(.)} 

まず、私はパイプを使用して配列に文字列を分割したいので、それは次のように効果的である:

{something:here}{examp.le:!/?foo|bar}BLAH 

{something/else:here}:{and:here\\}(.)} 

しかし、中括弧内のパイプが無視されることに注意してください。これのために正規表現の式を計算する必要があります。もともとindexOfを使用していましたが、中括弧内のパイプを考慮する必要があるため、複雑になります。

それはまだ終わっていない!私はまた、それぞれの文字列を中括弧の中にあるものによって別々の部分に分割する必要があります。だから私は、2つの配列は含むで終わる:

ARRAY1

{something:here} 
{examp.le:!/?foo|bar} 
BLAH 

ARRAY2

{something/else:here} 
: 
{and:here\\}(.)} 

私が言うの方法として、最初の閉じ中括弧の前にダブルスラッシュを追加しましたこれを無視してください。しかし、これを行うための正規表現を把握することはできません。

誰でも手助けできますか?

答えて

0

"string in braces"または "just string"をすべて見つけ、見つかった部分文字列を繰り返し処理し、パイプが見つかったときに分割します。

str = "{something:here}{examp.le:!/?foo|bar}BLAH|{something/else:here}:{and:here\\}(.)}" 

var m = str.match(/{.+?}|[^{}]+/g) 
var r = [[]]; 
var n = 0; 
for(var i = 0; i < m.length; i++) { 
    var s = m[i]; 
    if(s.charAt(0) == "{" || s.indexOf("|") < 0) 
     r[n].push(s); 
    else { 
     s = s.split("|"); 
     if(s[0].length) r[n].push(s[0]); 
     r[++n] = []; 
     if(s[1].length) r[n].push(s[1]); 
    } 
} 

このexprはエスケープ括弧

var m = str.match(/{?(\\.|[^{}])+}?/g 
+0

乾杯のstereofrogを処理するために、おそらく良いでしょう。私はアプローチが好きです:)それはほぼそこにあると思います。文字列を最初に 'm'配列に分割すると、\\で始まる中括弧は無視されません。これを行う方法は? – WastedSpace

+0

変更された正規表現の行には ")"がありません。 – thirtydot

+0

あなたは天才の仲間です。正確に私が探しているもの:)ありがとうございました。これで頭をたくさん掻いてきた! – WastedSpace

関連する問題