2

私の pattern:<p(\s+(.*)?)?>(.[^</p>]*)?</p>が正しく動作しない理由を教えてください。一致例:

  1. <p>This is a test and anything can be here even other <tags>tags</tags></p>
  2. <p style="test">This is a test</p>
  3. <p></p>

上記がすべて 1 行にある場合、3 つの個別のパターンが見つかるはずです。以下のリンクは、非常に奇妙な真の動作を示しています...

http://regexr.com?33jrn

見つかった一致は、見つかったらすぐに開始し、見つけたら<pすぐに停止する必要があります。</p>

4

3 に答える 3

3

正規表現にはいくつかの問題があります。彼らがどのように見えるか見てみましょう。

これがあなたの正規表現です: -

<p(\s+(.*)?)?>(.[^</p>]*)?</p>
  • 問題 1: -パターンに注意してください(.*)?。それはあなたが思うことをしていません。これは、量指定子に消極的な振る舞いを強制するものではありません*。むしろ(?)、貪欲な量指定子よりもオプションの量指定子を強制することです*0 or 1の一致の繰り返しを意味し(.*)ます。?しぶしぶにするためには、ブラケットの内側に移動する必要があります。(.*?)したがって、代わりにを使用する必要があります(.*)?
  • 問題 2: - [^</p>]ではなく否定</p>する -<, /, p, >別の文字として。文字クラスでは、各文字は文字どおりに解釈されることに注意してください。そこにグルーピングはありません。したがって、のいずれかが続かない場合に(.[^</p>]*)一致することを意味します。それはあなたが望むものではありません。ではないシーケンスに一致させたい場合は、次のように否定先読みを使用できます: - . これで、最初に次のシーケンスが ではないかどうかがチェックされ、次に次の文字と一致します。character0 or more repetition[</p>]</p>((?!</p>).)*</p>

したがって、正規表現パターンは次のようになります。 -

<p(\s+(.*?))?>((?!</p>).)*</p>

または、正規表現を次のように単純化することもできます: -

<p[^>]*>((?!</p>).)*</p>
于 2013-01-31T08:29:53.800 に答える
1

これを試して:

<p.*?>.*?</p>

このページで貪欲と嫌悪について読んでください:「貪欲、嫌悪、所有格の数量詞の違い」。

于 2013-01-31T08:24:50.037 に答える
1

問題は にあります。つまり、次の(.[^</p>]*)?ことを意味します。

  • 単一の文字
  • <a 、 a 、 a /、および ap以外の任意の char が n 回続く>

文字列 n timesではない</p>ことを意味したかったと思いますが、これはそれを行う方法ではありません。

.*?代わりに試してみてください: <p(\s+(.*)?)?>.*?</p>.

whileは最長の文字列に一致することを.*意味し、最短の文字列に一致することを意味します。.*?

たとえば、文字列 の#foo#bar#場合、.*は一致#foo#bar#しますが、 は.*?一致し#foo#ます。

于 2013-01-31T08:25:36.717 に答える