2013-08-21 15 views

答えて

3

これは、あなたが怠惰なオペレータの役割を理解することができます:

/<.+?> e/.exec("a <b> c <d> e <f> e")` // -> ["<b> c <d> e", "<f> e"] 
/<.+> e/.exec("a <b> c <d> e <f> e")` // -> ["<b> c <d> e <f> e"] 

<.+?> eの意味:<が発見されると、最初> e

を見つける

<.+> eは意味:一度<が見つかりました。が最後に見つかりました> e

具体的には<[^>]+> eを使用することができます(これは、即時処理が可能な場合はX.*?XではなくX[^X]Xの表記が常に可能です)。 .+が怠惰にすることにより

3

"<b> c <d> e"は完全に有効な結果です。あなたの正規表現は「<と一致してから> eと一致します」と言っています。これはあなたが得ているものです。 「直感的に」"<d> e"はより良い一致のように見えるかもしれませんが、正規表現エンジンは直感を持たず、一致して停止する最初の部分文字列を見つけます。

2つ以上の試合の中から選択すると貪欲が出ます。これは1つの試合しかないため、ここでは該当しません。あなたの文字列が2 > eを持っていた場合、違いは次のようになります。?はあなたがで一致しようとして終了することを言っていないので、あなたが経験している行動が起こっている、それは非貪欲作って

/<.+> e/.exec("a <b> c <d> e more > e") 
> ["<b> c <d> e more > e"] 
/<.+?> e/.exec("a <b> c <d> e more > e") 
> ["<b> c <d> e"] 
+0

'非貪欲オペレータが –

+0

@shiplu nothing'やっているようだ:「説明してください..何もしていないようだ "。貪欲な式(上)で見つかった文字列は、貪欲でない式で見つかった文字列よりも9文字長く、貪欲でない '? 'だけが唯一の違いです。したがって、観測者は*何かをします。 – usr2564301

3

>> eの一部ではありません。現在; <

  • 試合まで>またはライン
    1. の最後までテキストを

      /<.+?> e/ 
      
      1. 行く、それはラインの終わりだった場合、それならば、それは>
        1. た場合null
        2. を返します> e、完全一致
        3. そうでない場合は、含まれ、.+は喜ん>、スペースや文字にマッチしますので、これらが含まれます、覚えておいてください2

    を再開します。それはラインの終わりだった場合<

  • 試合以外のすべて>
  • >または行の終わりがnull
  • を返し、
    1. を見つけるまでは、テキストによる

      /<[^>]+?> e/ 
      
      1. 移動を望んでいたように見えますあった場合>
        1. それは> eある場合は、完全一致
        2. そうでない場合は、戻っては1

    はそれが>に遭遇したときであるので、これが起こる

    /<[^>]+?> e/.exec("a <b> c <d> e") 
    // ["<d> e"] 
    

    に結果の進みます> eの一部ではなく、開始位置が間違っていなければならないことを知っているので、テキストag次の時までは、<です。 regular-expressions.infoから

  • +0

    それは答えではありません。貪欲な操作はここでは機能していないのですか? '問題はthatsです –

    +0

    '?'はうまく動作しています –

    +1

    @ shiplu.mokadd.im:非貪欲な作品はうまくいきますが、貪欲でないことを意味するのは間違っています。同じテストストリングの位置から始まるすべてのストリングの中で可能な最短のマッチが選択されますが、右揃えのマッチが最短であると誤って信じられます。試合の決定がラインの下で改訂されることを願っています(私はそれに気づいていないので意図はありません)。 – collapsar

    2

    これを理解するために非常に重要なポイントです:正規表現指向エンジンは 常に「よりよい」マッチは後で 見つけることができたとしても、左端の一致を返します。

    正規表現エンジンは、左から文字列を通って、それぞれの文字に対して、「ここから始まる一致を見つけることができますか?」というメッセージが表示されます。ノン・グリーディー・オペレーターは、それがなければ見つからないので、エンジンが試行を続けます。つまり、最初の<からチェックすると、一致するものが見つかるでしょう。 2番目の<から始まる試合をチェックすることなく、それほど遠くにないので)。

    あなたが、「E」に続く角括弧の単一のセットをしたいように思えるものと一致させるために

    、あなただけ

    <[^>]+>[ ]e 
    

    (スペースに注意してください「真ん中には>ありませんことを確認してくださいそれが必要なためではなく、明確にするために文字クラスに入っています。)

    2

    は、パターンが<.+?最初のoccurance後一致> e権利を見つける必要があります。その場合、部分文字列<b> c、パターン> eの残りの部分はまだ一致していないので、式の.+の部分は、最後に> eの部分が一致するまで続きます...

    代わりに怠惰な演算子を使用しての
    'a <b> c <d> e' 
    xx//<-- no matches 
        <//<-- opening < matches, switch to .+? 
        b//<-- matched by .+ 
        > c//<-- does not match > e, but does match .+ 
         <d// matched by .+ 
          > e// matches rest of expression (> e), the resulting match is: 
    
        <b> c <d> e 
    

    、あなたのケースでは、私は単にのために行くだろう:

    /(?:<)[^>]+> e/ 
    //or even 
    /<[^>]+>\s+e/