2016-10-09 8 views
-1

果物をキャプチャするには マンゴーまたはブドウが入っていないので、次のパターンからフルーツをキャプチャする方法はありますか?2つのケース以外のブロック内のすべてを見つけるには

入力:

<frutis>banana,apple,orrange,lichie</frutis> 
<frutis>banana,apple,mango,lichie</frutis> 
<frutis>banana,grapes,orrange,lichie</frutis> 
<frutis>banana,apple,orrange,guava</frutis> 

出力: バナナ、リンゴ、orrange、lichie 偽偽 バナナ、リンゴ、orrange、グアバ<

私は次のことを試してみました:

<frutis>([^mango|grapes]*)<\/frutis> 

答えて

0

試用:

<frutis>((?:(?!mango|grapes).)*)<\/frutis> 

ここではソースコード:

const regex = /<frutis>((?:(?!mango|grapes).)*)<\/frutis>/g; 
const str = `<frutis>banana,apple,orrange,lichie</frutis> 
<frutis>banana,apple,mango,lichie</frutis> 
<frutis>banana,grapes,orrange,lichie</frutis> 
<frutis>banana,apple,orrange,guava</frutis>`; 
let m; 

while ((m = regex.exec(str)) !== null) { 
    // This is necessary to avoid infinite loops with zero-width matches 
    if (m.index === regex.lastIndex) { 
     regex.lastIndex++; 
    } 

    // The result can be accessed through the `m`-variable. 
    m.forEach((match, groupIndex) => { 
     console.log(`Found match, group ${groupIndex}: ${match}`); 
    }); 
} 

を私は2つの文字列が存在しないかどうかを検出するために先に負の外観を使用していました。 完全な説明を見つけることができますhere

+0

どのように機能しますか?説明できますか ? –

+0

腕時計、私は答えを編集しました –

+0

ありがとう作品 –

1

あなたがこの正規表現と同じように、負の先読みを使用することができます:あなたはそれを書いたようにクラスが[.....]は、単一の文字に一致する程度であるため、

<frutis>(?!.*mango)(?!.*grapes).*<\/frutis> 

を、それは動作しません、シーケンスではありません。また、パイプシンボルはクラス内で特別な意味を持ちません。それは単にリテラル|を意味します。

注:XML構造のデータを照合する場合は、正規表現は使用しないでくださいが、DOMパーサーを使用することはお勧めしません。

関連する問題