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

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

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

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

Q&A

解決済

2回答

2478閲覧

htmlで<body>には入っているけど、それが<xxx>の中だったらfalseになるような判定

hash

総合スコア63

正規表現

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

0グッド

0クリップ

投稿2016/10/27 03:16

編集2016/10/27 03:41

htmlで<body>には入っているけど、それが<xxx>の中だったらfalseになるような判定

htmlを対象に特定の語句が入っているかを抽出したいのですが、

<body>には入っているが、それが<xxx>に入っているようだったらfalseになるような正規表現は可能でしょうか? ちなみにhtmlは改行コードを除去して判定しています。

xxxは任意のタグが入ります。

希望する判定は以下のような感じです。対象は"abc"

<body>hogehogehoge abc hogehoge</body> -> true <body>hogehogehoge abc<xxx>hogehoge</xxx>hogehoge</body> -> true (abcが<xxx>タグ内にないのでtrue) <body>hogehogehoge<xxx>abc</xxx>hogehoge</body> -> false (abcが<xxx>タグ内にあるのでfalse) <body>hogehogehoge abc <xxx>abc</xxx>hogehoge</body> -> true (abcが<xxx>タグ内にあるが、<xxx>タグ外にもあるのでtrue)

htmlファイルの中から特定の語句が<body>内に含まれているかどうかを判定したいのですが、
特定の語句が指定のタグ内にのみ含まれている場合はfalseとしたい。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/10/27 03:21

xxx は実際は有効なタグと言うわけではなくあくまで xxx なのですか? 例の 2 番目と 3 番目の違いが分からないのですが? 正規表現の問題ということでいいのですか? 使用言語は?
ikedas

2016/10/27 03:25

ほとんどのテキストは<body>要素に入っていると思いますが、「<body>」は例でしょうか、それともあくまで<body>でしょうか。
hash

2016/10/27 03:36

<bodyと入れているのは<titleを省きたいという都合があるのですが、xxxをtitleにすれば解決できる気がするので、あくまでbodyということでもありません。
guest

回答2

0

ちなみに

HTML

1//<xxx>と</xxx>の間にはいるが<xxx>タグの外にいる 2<body>hogehogehoge <xxx>111</xxx> abc <xxx>222</xxx>hogehoge</body> 3 4//<xxx>が閉じられてない 5<body>hogehogehoge <xxx>abc hogehoge</body> 6 7//正しくないHTML 8<body>hogehogehoge <yyy> <xxx> </yyy> abc </xxx> hogehoge</body>

など、想定しておかないと思わぬ判断ミスがあるかもしれません

投稿2016/10/27 07:36

yambejp

総合スコア114572

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

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

0

ベストアンサー

<body>要素の始まりと終わりを表す正規表現 ``` <body\s[^>]*> </body> ```

<xxx>要素の始まりと終わりを表す正規表現

<xxx\s[^>]*> </xxx>

その他の要素の要素自身、始まり、終わりを表す正規表現

<[-\w]+\s[^>]*/> <[-\w]+\s[^>]*> </[-\w]+>
  • ここで\w[0-9A-Za-z]と等価とします。\wは拡張仕様ですので、環境によっては使えません (また環境や設定によってはマッチする文字範囲が変わります)。

上に挙げた正規表現のいずれにもマッチしない部分は、単なるテキストであることになります。

すると、<xxx>要素が一回だけ現れる場合は次のように書けそうです。ご質問の条件で「abc」が見つかれば、キャプチャされたグループの1番目および/または2番目に入ります。

  • <なになに>の部分は上の部分表現で置き換えてください。部分表現まで全部書くと極端に読みづらいので。
<body始め>(?:.*?(abc)?.*?<その他要素>)*?<xxx始め>.*?<その他要素>)*?<xxx終り>(?:.*?(abc)?.*?<その他要素>)*?<body終り>
  • ここで(?:...)*?は拡張仕様ですので、環境によっては使えません。

ところで、<xxx>要素が複数の回数現れる場合は、想定される回数に応じて正規表現を書き換える必要があります。また、任意の回数に対応できる正規表現はありません。正規表現の性質上、不可能なのです。


いつも思うんですが、「○○する正規表現を教えて下さい」って質問して来られる方って、正規表現を、ねらったものを一発でみつけてくれる魔法の道具だと思ってませんか。

実際には、思った通りのテキストにマッチさせるのは難しいどころか、思いがけないものにマッチしてしまうことも多いです。というか、そういう「副作用」を起こさない表現を書くほうが難しいです。また、ちょっと複雑なことをさせようとすると正規表現のほうがそれに輪をかけて複雑になって、何をやってるのかわからなくなります。ある程度以上複雑なテキスト処理には、使ってはいけないものだと思います。

HTMLの解析をしたければ、HTMLパーサのライブラリ (DOMやSAXなどを使うもの) やトランスフォーマのライブラリ (XSLTなど) を使うほうが、ずっといいです。

投稿2016/10/27 04:14

編集2016/10/27 04:18
ikedas

総合スコア4227

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

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

hash

2016/10/27 04:30

ご丁寧な回答ありがとうございます。 > いつも思うんですが、「○○する正規表現を教えて下さい」って質問して来られる方って、正規表現を、ねらったものを一発でみつけてくれる魔法の道具だと思ってませんか。 そうですね。。魔法の道具だと思ってました。。。 パーサーで対応するようにしますが、大変参考になりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問