正規表現対応のソフトウェアで検索や置換を行いたいため、学習を始めたばかりです。関連質問を見ていてわからない点があったので、教えて下さい。
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>
よろしくおねがいいたします。
>以降のご回答は、FG以外がうまくいかない理由
正規表現は、メタ文字を覚える=正規表現が使えるということではありません。
やみくもにいろいろ試してもダメです。
正規表現とは、文字列のモデル化です(重要)。
この場合だと
--
「<p class="style」という文字列がある。
その後に「数字」が一つ以上ある。
「">商品」という文字列がある。
その後に「<ではない文字」が0個以上ある。この部分は記憶して後で使いまわす。
「</p>」という文字列がある。
--
ということになります。重要なのは、メタ文字をどう書くかより、こうしたモデル化ができるかどうかです。
これを正規表現で書くと、
検索
<p class="style\d+">(商品[^<]*)</p>
置換
<li>\1<li>
となります。
>\nが幾つまで増やせるか
ちょっと質問の意味を理解しかねますが、通常のテキストエディタ上でしたら、マルチラインとして正規表現が動いているはずです。ですから、下記のように書いた場合
<[^>]+>
中にいくつ改行があっても最後の閉じ>までマッチします。
>任意文字列が1字でも2字でも、この表現でOKなのでしょうか?
[^\.]+は、ドット(.)文字以外の1文字以上を表します。
ですから、たとえば、
abcd123.
にヒットします。
>検索&置換の対象としたい文字列のサンプル1
[^<\n\r]+
または
.+?
などと記述します。
>検索&置換の対象としたい文字列のサンプル2
一般的なHTMLでタグ内を検索したいときは
<[^<\n\r]+>
または
<.+?>
タグ外であれば
>[^>]+<
みたいな感じでいかがでしょうか?
【注意すべきこと】
●一般的にHTMLはタグ内の改行が許可されているので、配慮が必要です。
rubyまたはperlで1行づつ処理するようなときは、終了タグがあらわれるまでスタックするか、すべてを一度文字列として溜め込んでからマルチラインで処理することになります。
下記URIはダミー
http:/q.hatena.ne.jp/1154101494 ご回答ありがとうございます。
2番さんの方にまとめさせていただいたので、そちらをご覧下さい。
A1.
willcomのにもvodafoneのにもついている[^\.]+は、「ピリオド以外の文字が1文字以上」です。vodafoneについては過剰な条件と言えるわけですが、間違ってはいないですね。1文字だけのものを受理させたければ「+」を削ればいけます。
A2.
「<でも>でもない任意の文字0個以上」は「[^<^>]*」です。
ですから、
<font[^>]*>([^<^>]*)</font>
と書けます。
置換時には\1でタグに囲まれた内容が取り出せます。
http://q.hatena.ne.jp/1154101494 ご回答ありがとうございます。
1-2番さんにまとめレスです。
置換対象(改
s1|
商品aa
s2|
商品bc
s3|
商品def
s4|
商品
置換後文字列
検索文字列@試作 使用環境 emeditor6(正規表現置換)
A| × |
商品[^<\n\r]
|B| △ |
商品.+?
|C| × |
商品<.+?>
|D| × |
商品>[^>]+<
|E| △ |
商品[^<^>]*
|F| ○ |
商品([^<^>]*)
|H| △ |
商品[^<^>]*
| [^<^>]* を()でくくればOK |
置換時に\1でタグに囲まれた内容が取り出せるとのことでしたので、\2も使える?と思い、Gが○でHが△なので、「括弧」でかこめば?と実験しました。
s5|
商品def
hatenaI|
この表現でOKです。
[^\.]+\.は、
「ドット以外の文字が一文字以上、に続いてドット」
となります。
*と+と? について調べると分かります。
検索&置換の対象としたい文字列のサンプル1に対しては、
<p class="style[0-9]+">[^<]*</p>
検索&置換の対象としたい文字列のサンプル2に対しては、
<font size="-7">[^<]*最初に出てくる→</font>
で、マッチすると思います。
質問文が悪かったかもですね。
<font size="-7">??????最初に出てくる→</font>
「??????最初に出てくる→」この部分が、一定しない文字数の文字列、のつもりでした。
>以降のご回答は、FG以外がうまくいかない理由
正規表現は、メタ文字を覚える=正規表現が使えるということではありません。
やみくもにいろいろ試してもダメです。
正規表現とは、文字列のモデル化です(重要)。
この場合だと
--
「<p class="style」という文字列がある。
その後に「数字」が一つ以上ある。
「">商品」という文字列がある。
その後に「<ではない文字」が0個以上ある。この部分は記憶して後で使いまわす。
「</p>」という文字列がある。
--
ということになります。重要なのは、メタ文字をどう書くかより、こうしたモデル化ができるかどうかです。
これを正規表現で書くと、
検索
<p class="style\d+">(商品[^<]*)</p>
置換
<li>\1<li>
となります。
>\nが幾つまで増やせるか
ちょっと質問の意味を理解しかねますが、通常のテキストエディタ上でしたら、マルチラインとして正規表現が動いているはずです。ですから、下記のように書いた場合
<[^>]+>
中にいくつ改行があっても最後の閉じ>までマッチします。
丁寧かつ鋭利なご回答ありがとうございます。
モデル化はまだmy辞書にない言葉だったので、あちこち掘り返して調べてきました。モデル化=簡略化=とりかかる前に問題の仕組みを整理する?でしょうか。いみふめいデータを表計算にする時、あらすじをみつけて分析して仕様を決めてから入力するような。そうすると、特例なもの=例外処理?は別に分けた方がキレイですよね。
あと、マルチラインとして正規表現が動いて=CR+LFを越えて…と解釈しました。
メタ文字そのものはじっくり腰据えて覚えるしかないと思うのですが、ネットで拾いにくい「概念」の部分を解説していただけてありがたいです。
>>\nが幾つまで増やせるか
これも質問文の説明不足でしたね。この機能、「後方参照」という名前なんですね。今しがた、見つけました。
\数字 の 数字 の部分は、最大9みたいなので(実験してみた…(汗)1文字1意味なんだから続くわけないのかも…)、10以上の後方参照が必要なケースがあるとしたら、たぶん問題の整理が足りなくて、キレイにできるはずなのでしょう。
どこまで論理的に効率良く問題を切り分けていくか、っていうところをちゃんと押さえられるようになれば、複雑なものも解読できそうです。
一応、どなたか補足などあるやも知れませんので、しばらくは閉めずに置いておきます。
ポイントはお礼も含め手動で配分させていただきますので。
ご協力ありがとうございますm(_ _)m
3番の回答を見て思ったのですが、最短一致をさせたい、ということですよね。
最短一致を表す"?"を使えば良いのではないでしょうか。
(対応していないツールもあるかもしれません。)
[参考URL]
fontタグ内に別のタグがある場合、
<font size="-7">([^<]*?)</font>
では一致しなくなってしまいます。
(font内に別のタグが含まれないのであれば、上の例で問題ありません。)
以下のように.*の後に?を置き、任意の文字列の0文字以上の繰り返しの最短一致にしてみてはいかがでしょう。
<font size="-7">(.*?)</font>
「\nが幾つまで増やせるか」という部分ですが、括弧内に一致した文字列をいくつまで置換後の文字列で使えるのか、ということですよね。
これはツールに依存すると思いますが、基本的に制限はありません。
括弧を入れ子にした場合の動きには注意する必要があります。
(基本的には左括弧の順に数字が振られるはずです。)
以下、簡単に説明します。
Aは"商品"の後に"<"と改行以外の1文字があるものにしか一致しません。
Bは"商品"の後に任意の1文字が1個以上あるものにしか一致しません。
C、Dは意味不明です。("<"と">"には正規表現では特別な意味はありません。)
Eの中に出てくる"<"と">"にはさまれた^の役割がよく分かりません。(\でエスケープしないと意味をなさないような気がします。)
とりあえず各記号の意味と使い方を一通り確認してみると良いと思います。
また、正規表現は基本部分は同じですが、独自に拡張されたりしているので、言語、ツールによって実装が異なっているのでご注意ください。
皆様、ご回答ありがとうございます。
my辞書に最長一致と最短一致と、あと一緒に出てきた用語を追加しました。
ゆっくりでも理解して正しく使えるようになれば、仕事にも役立てられると思います。
コメントありがとうございます。
実はオープンする前に質問履歴を拝見していました。
表現がかなり長くなっているので、自分ではない人に置換作業させる際に長すぎても不安だなぁと感じました。
ある程度、シンプルかつきっちり(=一度にまとめてではなく、何回かに分けてでも見やすい)してないと、変更があったきに自分がスパゲッティになっちゃいそうで。
丁寧かつ鋭利なご回答ありがとうございます。
モデル化はまだmy辞書にない言葉だったので、あちこち掘り返して調べてきました。モデル化=簡略化=とりかかる前に問題の仕組みを整理する?でしょうか。いみふめいデータを表計算にする時、あらすじをみつけて分析して仕様を決めてから入力するような。そうすると、特例なもの=例外処理?は別に分けた方がキレイですよね。
あと、マルチラインとして正規表現が動いて=CR+LFを越えて…と解釈しました。
メタ文字そのものはじっくり腰据えて覚えるしかないと思うのですが、ネットで拾いにくい「概念」の部分を解説していただけてありがたいです。
>>\nが幾つまで増やせるか
これも質問文の説明不足でしたね。この機能、「後方参照」という名前なんですね。今しがた、見つけました。
\数字 の 数字 の部分は、最大9みたいなので(実験してみた…(汗)1文字1意味なんだから続くわけないのかも…)、10以上の後方参照が必要なケースがあるとしたら、たぶん問題の整理が足りなくて、キレイにできるはずなのでしょう。
どこまで論理的に効率良く問題を切り分けていくか、っていうところをちゃんと押さえられるようになれば、複雑なものも解読できそうです。
一応、どなたか補足などあるやも知れませんので、しばらくは閉めずに置いておきます。
ポイントはお礼も含め手動で配分させていただきますので。
ご協力ありがとうございますm(_ _)m