-1

私は正規表現の問題に閉じ込められています。大きな文字列に沿って、文字列の両側に「< strong>」および「< /strong>」タグを配置する必要があります。たとえば、私が持っている場合:

"This is a test, and test word appears two times"

選択された文字列は「test」であり、そのまま残ります。

"This is a <_strong>test<_/strong>, and <_strong>test<_/strong> word appears two times"

最初は、「ReplacedAll」と組み合わせて正規表現関数を使用していると思います。問題は、より大きな文字列に <_strong> タグがある場合に発生します。次のようなものがあります。

"This is a test, and <_strong>test word<_/strong> appears two times"

それはそのようなもののままです:

"This is a <_strong>test<_/strong>, and <_strong><_strong>test<_/strong> word<_/strong> appears two times"

アイデアは、 <_strong> タグの間にない場合にのみ、文字列「test」を変更する正規表現を見つけることです。しかし、私はそれを見つけることができません。

4

1 に答える 1

2

これには、二重否定先読みを使用できます。

test(?!(?:(?!<_strong>).)*<_/strong>)

正規表現101のデモ

これにより、 the のtest後に a が続かないことが保証されます<_/strong>(間に隙間がない限り<_strong>)。

(?! ... )否定先読みです。前の式の後に否定先読み内の式が続く場合、一致を防ぎます。

例えば

a(?!b)aが続かないすべてに一致しbます。

(?!(?:(?!<_strong>).)*<_/strong>)には 2 つの否定的な先読みがあります。まず、あると言え(?!.*<_/strong>)ます。がある場合、これらの後に がない限りtest(?!.*<_/strong>)、これはすべてに一致します。さて、これは 2 番目の文では機能しません。test<_/strong>test<_/strong>

トリックは、と の間に開始タグがない場合にのみ、 a がタグtest内にあると見なされることです。それがに変わったところです<_strong><_strong>test<_/strong>.*(?:(?!<_strong>).)*

以前の回答でリンクした regex101 デモ サイトで遊ぶことができます。

于 2013-09-25T12:04:18.937 に答える