質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

4685閲覧

</(.+)>の正規表現で、(.+)がある文字列以外の場合にマッチする正規表現とは?

sounisi5011

総合スコア697

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

1クリップ

投稿2015/01/23 14:15

編集2015/03/14 17:35

お世話になります。

只今、正規表現でどう表現するべきなのか分からない問題があります。
それは、以下の様なものです。

</(.+)>の正規表現を、</a></audio></del>以外の</(.+)>にマッチするようなパターンに変更せよ。
例えば、</body></address></example></foo></ああああ>等はマッチするが、</a></audio></del>はマッチしない。

HTML5で省略できるタグにマッチする正規表現 - Qiitaの執筆中、このような問題に出くわしました。
(.+)をある文字列以外の文字列としたいのです。

先読み・後読みを試しましたが、上手く行きません。
</a>を含まないパターンを書くと、</address>にマッチしない、等の問題が発生します。

このような正規表現はどのように記述すれば良いのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

a, audio, del, ins, map, noscript, video 以外の要素の閉じタグにマッチする正規表現ですが、否定先読みを使って
</(?!a>|audio>|del>|ins>|map>|noscript>|video>)(.+)>
で良いのではないかと。「閉じタグだから要素名直後に>が来る」という前提で書いてますけど(あと、あまり美しくない)。

投稿2015/01/23 15:10

riocampos

総合スコア241

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sounisi5011

2015/01/23 15:39

ありがとうございます!
riocampos

2015/01/23 15:44

Qiita で書かれている別解の </(?!(a|audio|del|ins|map|noscript|video)>)(.+)> でもいいですね(このほうが美しい)。 キャプチャしないように </(?!(?:a|audio|del|ins|map|noscript|video)>)(.+)> という書き方もありますね。
sounisi5011

2015/01/23 16:02

キャプチャしない括弧を使うと、正規表現が更に読みにくくなってしまいます。 (現時点でも読みにくいですが…) Qiitaの投稿は、削除可能なHTML要素の文字列にマッチすることが目的で、キャプチャした値の利用という観点では見ていません。 また、「キャプチャしない括弧」の正規表現を知らない閲覧者がいるかもしれませんし、キャプチャしない括弧を利用しても結果には影響しません。 よって、キャプチャしない括弧は利用しないという方針で書きます。
guest

0

綺麗かどうかは怪しいですが
これで出来ました

^</(?!a>|audio>|del>).+>$

念のためこのサイトで試してみてください
http://scriptular.com

投稿2015/01/23 15:05

syokeinin

総合スコア74

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問