1

このスパンタグのIDがblkで始まることが保証されているスパンタグ間の文字列の内部を一致させたいと思いました。

これをgroovyと一致させるにはどうすればよいですか?

例 :

<p>I wanted to try to <span id="blk1">match</span> the inner part of the string<span id="blk2"> between </span>the span tags <span>where</span> it is guaranteed that the id of this span tags <span id="blk3">starts</span> with blk.</p>

上記の例によれば、私は

   match
   between
   starts

次のことを試しましたが、null を返します。

 def html='''<p>I wanted to try to <span id="blk1">match</span> the inner part of the string<span id="blk2"> between </span>the span tags <span>where</span> it is guaranteed that the id of this span tags <span id="blk3">starts</span> with blk.</p>''' 

 html=html.findAll(/<span id="blk(.)*">(.)*<\/span>/).join();
 println html;

4

2 に答える 2

3

あなたはspan片側と反対側にいるようですstrong

.*さらに、正規表現は貪欲であるため、一度にほとんどの文字列に一致するため、単独で使用する場合は注意が必要です。通常は、次を使用して遅延させる必要があります.*?

タグ間のテキストを一致させるために使用する場合(.)*、そのグループから実際のテキストを取得するのではなく、一致した最後の文字のみを取得します。一致するグループ内に量指定子を配置する必要があります。

を使用する[^<>]+と、html タグ間でテキストを一致させるためのはるかに優れた方法であり、いくつかの点を除いて .* に似ています。

  1. 「<」と「>」を除くすべての文字に一致します。
  2. 少なくとも 1 文字に一致する必要があるため、空のスパンには一致しません。

さらに、「blk」に続くものが常に整数であることを確認できる場合は、\d+ を使用して一致させることをお勧めします。

html=html.findAll(/<=span id="blk\d">([^<>]+)<\/span>/).join();

そうは言っても、私は Groovy の経験がほとんどありませんが、これら 3 つの単語を含むリストを出力してほしいと思いませんか? 次の正規表現は、html からもテキストを抽出します。

html=html.findAll(/(?<=span id="blk\d">)([^<>]+)(?=<\/span>)/).join();
于 2013-05-03T06:57:27.467 に答える