0

以下で構成される文字列を照合する方法を教えてください:

  • いくつかのテキスト
  • 「より小さい」で始まり、その後に任意cat, dog, pen <cat>の値とより大きい値が続くもの
  • 次に、テキストが表示されるか、何も表示されない可能性があります。<cat> some text
  • 次に、同じタグの閉鎖など<cat> some text </cat>
  • 最終的にはいくつかのテキストやその他のタグが使用されます

したがって、例は次のようになります

some text <cat> another text </cat> <dog> </dog> other text <pen> bla bla bla </pen>
4

1 に答える 1

1

そのためには後戻りが必要です。使用している正規表現のフレーバーに応じて、次のようなものが機能する場合があります。

<(cat|dog|pen)>.*<\/\1>

上記はPerlで動作します。ただし、使用しているツールによっては YMMV. たとえば、sed では、次のように動作します。

<\(cat\|dog\|pen\)>.*<\/\1>

コメントに記載されているよう.*に、真ん中は貪欲であってはなりません。そうしないと、<dog>blah</dog> <dog>foo</dog>一度だけ一致します。正確に行う方法は、正規表現エンジンによって異なります。

単純なケースでは、間にタグを許可しません:

<(cat|dog|pen)>[^<>]*<\/\1>

または、Perl では、正規表現を非貪欲にすることができます。

<(cat|dog|pen)>.*?<\/\1>

または、後戻りせずに行うこともできますが、それはフットワークです。

 (<cat>.*?<\/cat>|<dog>.*?<\/dog>|<pen>.*?<\/pen>)
于 2012-10-09T22:38:46.047 に答える