基本的に、閉じた <p> タグの一部ではない HTML の / に一致する必要があります。これは私がこれまでに得たものですが、実際には期待どおりに機能せず、しばらく試してみました.
((?<!(p))\/(?!(>))) | ((?<!(<))\/(?!(p)))
Javaで動作するには正規表現も必要です。
例として:
<div>テスト</div> <span>テスト</span> <p>何か<p/> </p>
末尾/
のタグ以外は全部一致させたい!<p>
/(?!p)
これはうまくいくようです。しかし、質問が何であるかわかりません。
<div>test</div> <span>test</span> <p>something<p/> </p>
matches: / / /
幸いなことに、Java は後読みと先読みの両方をサポートしています (対照的に、私がほとんどの時間を費やしている言語である JavaScript は先読みのみをサポートしています)。
したがって、探しているパターンは次のとおりです。
(?<!<p)/(?!p>)
<p
このパターンは、前に aも後ろにも a がないスラッシュに一致しp>
ます。したがって<p/>
、同様に除外します</p>
。
先読み/後読みアサーション (「ゼロ幅」アサーションと呼ばれることが多い) は、実際には一致に含まれていません。基本的に、一致させようとしているものの前に (後読み) または後 (後読み) の部分式があると主張します。この場合、否定的なアサーションを使用しています (前に付けない/後に付けない)。
正規表現を使用して HTML を解析することは、トリッキーな作業です。ある回答が指摘したように、HTML はコンテキストフリーであるため、HTML で完全に解析することはできず、一致を混乱させる HTML の可能性が残されています。不適切な形式の HTML から始めることさえやめましょう。
ただし、空のタグで次の一般的なバリエーションを検討します。
<p />
これを処理するには、一致に空白を追加します。
(?<!<p\s*)/(?!p>)
問題が発生する可能性があるのは、奇妙な空白 (まだ有効な HTML) です。次のスラッシュは、上記の正規表現と一致します。
< p/>
<p/ >
これは、正規表現に空白の繰り返しを追加することで対処できます。前述のように、これはテキスト内のスラッシュにも一致するため、次の入力は 1 つのスラッシュ (テキスト内のスラッシュ) のみに一致します。
<p>some text / other text</p>
最後に、もちろん CDATA グループがあります。次の入力は、スラッシュなしに一致します。
<![CDATA[This <p/> isn't actually a tag...it's just text.]]>