人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

[正規表現]
正規表現対応のソフトウェアで検索や置換を行いたいため、学習を始めたばかりです。関連質問を見ていてわからない点があったので、教えて下さい。

http://q.hatena.ne.jp/1154063022 正規表現
↑関連
willcom(例:dj.pdx.ne.jp)の場合、任意文字列は1文字とは限らない筈ですが、回答文はvodafoneもwillcomも同じ[^\.]+\.となっています。任意文字列が1字でも2字でも、この表現でOKなのでしょうか?

かつ、文字列Aと文字列Bの間に、不特定数の文字列が挟まっている場合の表現方法を教えて下さい。

検索&置換の対象としたい文字列のサンプル1
-<p class="style6">???</p>
-<p class="style12">???</p>
-<p class="style100">???</p>
検索&置換の対象としたい文字列のサンプル2
-<font size="-7">??????最初に出てくる→</font>

よろしくおねがいいたします。

●質問者: naleringar
●カテゴリ:コンピュータ ウェブ制作
✍キーワード: Class DJ ne.jp vodafone WILLCOM
○ 状態 :終了
└ 回答数 : 6/6件

▽最新の回答へ

1 ● せうぞー
●15ポイント

>任意文字列が1字でも2字でも、この表現でOKなのでしょうか?

[^\.]+は、ドット(.)文字以外の1文字以上を表します。

ですから、たとえば、

abcd123.

にヒットします。

>検索&置換の対象としたい文字列のサンプル1

[^<\n\r]+

または

.+?

などと記述します。

>検索&置換の対象としたい文字列のサンプル2

一般的なHTMLでタグ内を検索したいときは

<[^<\n\r]+>

または

<.+?>

タグ外であれば

>[^>]+<

みたいな感じでいかがでしょうか?


【注意すべきこと】

●一般的にHTMLはタグ内の改行が許可されているので、配慮が必要です。

rubyまたはperlで1行づつ処理するようなときは、終了タグがあらわれるまでスタックするか、すべてを一度文字列として溜め込んでからマルチラインで処理することになります。


下記URIはダミー

http://www.seuzo.jp/

◎質問者からの返答

http:/q.hatena.ne.jp/1154101494 ご回答ありがとうございます。

2番さんの方にまとめさせていただいたので、そちらをご覧下さい。


2 ● Sampo
●20ポイント

A1.

willcomのにもvodafoneのにもついている[^\.]+は、「ピリオド以外の文字が1文字以上」です。vodafoneについては過剰な条件と言えるわけですが、間違ってはいないですね。1文字だけのものを受理させたければ「+」を削ればいけます。

A2.

「<でも>でもない任意の文字0個以上」は「[^<^>]*」です。

ですから、

<font[^>]*>([^<^>]*)</font>

と書けます。

置換時には\1でタグに囲まれた内容が取り出せます。

http://q.hatena.ne.jp/answer

◎質問者からの返答

http://q.hatena.ne.jp/1154101494 ご回答ありがとうございます。

1-2番さんにまとめレスです。

置換対象(改

s1|

商品aa

s2|

商品bc

s3|

商品def

s4|

商品

置換後文字列

  • 商品\1
  • 検索文字列@試作 使用環境 emeditor6(正規表現置換)

    A| × |

    商品[^<\n\r]

    |

    B| △ |

    商品.+?

    |

    C| × |

    商品<.+?>

    |

    D| × |

    商品>[^>]+<

    |

    E| △ |

    商品[^<^>]*

    |

    F| ○ |

    商品([^<^>]*)

    |

    H| △ |

    商品[^<^>]*

    | [^<^>]* を()でくくればOK |

    置換時に\1でタグに囲まれた内容が取り出せるとのことでしたので、\2も使える?と思い、Gが○でHが△なので、「括弧」でかこめば?と実験しました。

    s5|

    商品def

    hatena
    22
    44

    I|


    3 ● jan8
    ●2ポイント

    この表現でOKです。

    1. は一文字以上にマッチするから

    [^\.]+\.は、

    「ドット以外の文字が一文字以上、に続いてドット」

    となります。

    *と+と? について調べると分かります。

    検索&置換の対象としたい文字列のサンプル1に対しては、

    <p class="style[0-9]+">[^<]*</p>

    検索&置換の対象としたい文字列のサンプル2に対しては、

    <font size="-7">[^<]*最初に出てくる→</font>

    で、マッチすると思います。

    http://q.hatena.ne.jp/1154063022 ダミーです。

    ◎質問者からの返答

    質問文が悪かったかもですね。

    <font size="-7">??????最初に出てくる→</font>

    「??????最初に出てくる→」この部分が、一定しない文字数の文字列、のつもりでした。


    4 ● せうぞー
    ●40ポイント ベストアンサー

    >以降のご回答は、FG以外がうまくいかない理由

    正規表現は、メタ文字を覚える=正規表現が使えるということではありません。

    やみくもにいろいろ試してもダメです。

    正規表現とは、文字列のモデル化です(重要)。

    この場合だと

    --

    「<p class="style」という文字列がある。

    その後に「数字」が一つ以上ある。

    「">商品」という文字列がある。

    その後に「<ではない文字」が0個以上ある。この部分は記憶して後で使いまわす。

    「</p>」という文字列がある。

    --

    ということになります。重要なのは、メタ文字をどう書くかより、こうしたモデル化ができるかどうかです。

    これを正規表現で書くと、

    検索

    <p class="style\d+">(商品[^<]*)</p>

    置換

    <li>\1<li>

    となります。

    >\nが幾つまで増やせるか

    ちょっと質問の意味を理解しかねますが、通常のテキストエディタ上でしたら、マルチラインとして正規表現が動いているはずです。ですから、下記のように書いた場合

    <[^>]+>

    中にいくつ改行があっても最後の閉じ>までマッチします。

    http://www.seuzo.jp

    ◎質問者からの返答

    丁寧かつ鋭利なご回答ありがとうございます。

    モデル化はまだmy辞書にない言葉だったので、あちこち掘り返して調べてきました。モデル化=簡略化=とりかかる前に問題の仕組みを整理する?でしょうか。いみふめいデータを表計算にする時、あらすじをみつけて分析して仕様を決めてから入力するような。そうすると、特例なもの=例外処理?は別に分けた方がキレイですよね。

    あと、マルチラインとして正規表現が動いて=CR+LFを越えて…と解釈しました。

    メタ文字そのものはじっくり腰据えて覚えるしかないと思うのですが、ネットで拾いにくい「概念」の部分を解説していただけてありがたいです。

    >>\nが幾つまで増やせるか

    これも質問文の説明不足でしたね。この機能、「後方参照」という名前なんですね。今しがた、見つけました。

    \数字 の 数字 の部分は、最大9みたいなので(実験してみた…(汗)1文字1意味なんだから続くわけないのかも…)、10以上の後方参照が必要なケースがあるとしたら、たぶん問題の整理が足りなくて、キレイにできるはずなのでしょう。

    どこまで論理的に効率良く問題を切り分けていくか、っていうところをちゃんと押さえられるようになれば、複雑なものも解読できそうです。

    一応、どなたか補足などあるやも知れませんので、しばらくは閉めずに置いておきます。

    ポイントはお礼も含め手動で配分させていただきますので。

    ご協力ありがとうございますm(_ _)m


    5 ●
    ●20ポイント

    3番の回答を見て思ったのですが、最短一致をさせたい、ということですよね。

    最短一致を表す"?"を使えば良いのではないでしょうか。

    (対応していないツールもあるかもしれません。)

    [参考URL]

    fontタグ内に別のタグがある場合、

    <font size="-7">([^<]*?)</font>
    

    では一致しなくなってしまいます。

    (font内に別のタグが含まれないのであれば、上の例で問題ありません。)

    以下のように.*の後に?を置き、任意の文字列の0文字以上の繰り返しの最短一致にしてみてはいかがでしょう。

    <font size="-7">(.*?)</font>
    

    「\nが幾つまで増やせるか」という部分ですが、括弧内に一致した文字列をいくつまで置換後の文字列で使えるのか、ということですよね。

    これはツールに依存すると思いますが、基本的に制限はありません。

    括弧を入れ子にした場合の動きには注意する必要があります。

    (基本的には左括弧の順に数字が振られるはずです。)

    以下、簡単に説明します。

    Aは"商品"の後に"<"と改行以外の1文字があるものにしか一致しません。

    Bは"商品"の後に任意の1文字が1個以上あるものにしか一致しません。

    C、Dは意味不明です。("<"と">"には正規表現では特別な意味はありません。)

    Eの中に出てくる"<"と">"にはさまれた^の役割がよく分かりません。(\でエスケープしないと意味をなさないような気がします。)

    とりあえず各記号の意味と使い方を一通り確認してみると良いと思います。

    また、正規表現は基本部分は同じですが、独自に拡張されたりしているので、言語、ツールによって実装が異なっているのでご注意ください。

    ◎質問者からの返答

    皆様、ご回答ありがとうございます。

    my辞書に最長一致と最短一致と、あと一緒に出てきた用語を追加しました。

    ゆっくりでも理解して正しく使えるようになれば、仕事にも役立てられると思います。


    1-5件表示/6件
    4.前の5件|次5件6.
    関連質問


    ●質問をもっと探す●



    0.人力検索はてなトップ
    8.このページを友達に紹介
    9.このページの先頭へ
    対応機種一覧
    お問い合わせ
    ヘルプ/お知らせ
    ログイン
    無料ユーザー登録
    はてなトップ