正規表現の置換規則に関する質問

このQ&Aのポイント
  • 正規表現による置換の規則を破っているのでしょうか?
  • 辞書の訳語を表示する際、正規表現を使って、一部の文字列をゴシック表示しようとしています。
  • 2行目のような置換の仕方は規則破りなのでしょうか?代わりの書法を教えてください。
回答を見る
  • ベストアンサー

正規表現による置換の規則を破っているのでしょうか?

辞書の訳語を表示する際、正規表現を使って、次の文字列を含む文字列をゴシック表示しようとしています。 そこで次のようにしたのですが、1行目はうまく置換されますが、2行目は全く駄目です。 $yakugo =~ s/(\[再帰\]|\[現分\]|\[代動\]|\[過分\]|\(再\)|\[規則変化\]|\[不規則変化\])/<B>$1<\/B>/g; $yakugo =~ s/(\[\W+と共に\]|\[\W+詞\W+\]|\[次の\W+\]|\[ふつう\W+\])/<B>$1<\/B>/g; 2行目のような置換の仕方は規則破りなのでしょうか?済みませんが、どなたか、これに替わる書法で、2行目のような意図を達成する正規表現の式をお教え下さい。

  • Perl
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

[^\[]* これは、 \[ 以外の文字、となります。 それ([]の中の文字 を *で)が0個以上続いた といった意味です。 [^\[]+ とすると前後に何か文字がはいってないとHITしないので。 (+が一つ以上という意味なので)

参考URL:
http://tohoho.wakusei.ne.jp/wwwperl1.htm#Expr

その他の回答 (2)

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.2

追記。 ちょっと縮めて見ました。 $yakugo =~ s/(\[[^\[]*)(と共に|詞|次の|ふつう)([^\]]*\])/<B>$1$2$3<\/B>/g; ただ、これだと[正確がふつうなひと]というように前後に他の言葉が入った場合でもHITしてしまいますが。

tonka729
質問者

お礼

ありがとうございました。 <ただ、これだと[正確がふつうなひと]というように前後に他の言葉が入った場合でもHITしてしまいますが。 いや、むしろそれを望んでいました。お教え頂いた書式での効果は劇的に現れましたが、まだ場合によって[xxxxx]から次の[xxxxxx] までの間も全部ゴシックになってしまう場合もあるのですが、いろんな記号がそこに混じってしまっているので、何が原因だかまだ調査しきれていません。でもとても効果が上がりました。 お教え頂いたものをじーっと見つめて私のと比較しているのですが、たとえば一部分を抜き出して比較してみました: (moon night さん→ )   |\[ [^\[]*詞[^\]]* \]|   (わたし→ )          |\[ \W+詞\W+ \]| わたしは\W+を使っていますが、moon night さんの方法は[^\[]* ですね。これはどういう意味の設定をしているのですか? 済みません、正規表現の基本知識が甘いのです。解説をいただければ幸いです。

  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.1

こんな感じになりました。 $yakugo =~ s/(\[[^\[]*と共に[^\]]*\]|\[[^\[]*詞[^\]]*\]|\[次の[^\]]*\]|\[ふつう[^\]]*\])/<B>$1<\/B>/g;

tonka729
質問者

お礼

ご親切に解説をいただきありがとうございました。 とても勉強になりました。とほほさんのサイトで勉強をしていたつもりなのですが、いざ自分の頭で実践する時はわからないものですね。[ ] で囲まれた文字を文字クラスとする、というのははじめて実践するので、ためになりました。ましてクラスの後ろに*をつけるとは!!ビックリです。さすがにここまではどのお教室を覗いてもみつからないような。。。 また、正規表現でまたお世話になる予感がしますので、またその節はよろしくお願いします(^_^)

関連するQ&A

  • 正規表現で少し複雑な置換がしたい

    Javaというよりも、正規表現について質問です。 (一応、言語はJavaで、String#replaceAllを使います) 以下のルールで与えられた文字列の置換を行う正規表現を考えていますが、なかなかうまくいきません。 1.正規表現で \w+:: にマッチする文字列を削除する。 2.ただし、'' (シングルクォーテーション)で囲われている文字列は   1.の対象としない 3.ただし、\' (シングルクォーテーションの前に\があった場合は)   シングルクォーテーションと認識しない。 例: 置換前  A * B \'' CCC.DD::EEE' FFF.GGG::HH ' III' 置換後  A * B \'' CCC.DD::EEE' FFF.HH 'III' 色々試してみたのですが、どうしてもうまくいきません。 正規表現が得意な方、教えていただけますでしょうか・・?

    • ベストアンサー
    • Java
  • 正規表現を教えて下さい(テキストエディタでの置換)

    いつもお世話になっております。 正規表現に関して細かい質問をさせて下さい。 例えば、G-01,T-02,F-05とあったときに、 これを、01,02,05としたいとき、 正規表現の置換で「[A-Z]-[0-9][0-9]」→「[0-9][0-9]」とすると、 "[0-9][0-9]"という文字列だけ残ってしまいます。 既存の文字列をそのまま残すにはどのようにしたらよいでしょうか? ※テキストエディタでの置換に関してです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現で置換

    正規表現の初心者です。 テキストエディタを使って、「@:」で始まる以外の行の先頭に「//」を挿入してコメントアウトしたいのですが、正規表現がうまく書けません。 検索対象: ^[^(@:)] 置換文字列: // でいいのかなと思ったのですが、[]の中ではグルーピング用の()も文字として認識されてしまうのですね。 どのように書いたら正しく置換されるでしょうか。 どうかご教示ください。

  • 正規表現で一括置換

    現在、数多くの長文データを、テキストエディタの置換機能で一括置換しています。 jeditX(または秀丸エディタ)の正規表現をもちいた複数一括置換について質問させていただきます。 私は正規表現やPC言語の初心者です。どうぞよろしくお願いいたします。 かなり困り果てております。どうぞ、正規表現にくわしいかた、よろしくお願いします。 一二三『一二三にそれぞれ♪マーク』 という文章に対して 一♪二♪三♪ という一括置換をすることには成功しました。 こう書いています。 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪ これでぶじ、以下のように一括置換できました。 一♪二♪三♪ 現実には傍点や圏点をふっているんですが、判りやすく♪マークにしています。 この調子で長い文章も変換できていて満足していたのですが…… しかし代入文字が10個以上になったとたんに、まったく動きません。 ■置換したい文章 一二三四五六七八九十『一二三四五六七八九十にそれぞれ♪マーク』 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪\4♪\5♪\6♪\7♪\8♪\9♪\10♪ こうやると、置換後の文章は以下のようになってしまいます。 一♪二♪三♪四♪五♪六♪七♪八♪九♪一0♪ 10個目以降の数字が、正しく機能してくれません。 \10  という正規表現の書き方は 「一番目の値を参照して、それから数字の0を記入しなさい」 という意味になってしまうようです。 わたしは十番目の値を代入してほしいだけなんです。 \1 や \2 や \3 といった代入文字のように \10 や \11 を機能させる、正しい表記をご教授ください。よろしくお願いいたします。 ちなみに以下のように書いてもダメでした……。 \1\0 グーグルで1日中検索しても判りませんでした。jeditXの複数一括置換でこれをなんとかしたいのです。ご存じの方、どうぞ教えてください。よろしくおねがいします! 秀丸エディタをご利用で、正規表現にくわしい方も、ぜひヒントを出していただければと思います。

  • Perl正規表現わかりますか?

    下記のPerl正規表現ですが、どんな意味か分かるでしょうか? $var =~ s!/([^/]+|~(\.\.))/\.\./!/!g 参考書も読んでみたのですが分かりませんでした(セットされている文字列にどんなマッチング、置換をしているのでしょう) お分かりの方いれば、よろしくお願いします。

    • ベストアンサー
    • Perl
  • 秀丸で正規表現を使って置換

    あるファイルに関して、このような置換を行いたいです。 abc/xxx,yyy,zzz.html ↓ abc/xxx.html xxxとyyyとzzzはある任意の文字列(英数字で文字数はばらばら)で 「abc/」と「,」と「.html」は固定の文字列になります。 そこで、秀丸で開いて、正規表現による検索で、 「abc/.*,.*,.*.html」 として検索すると、該当部分が検索できることがわかりましたが、置換後をどのように設定すればいいのかわかりません。 置換後のabc/xxx.htmlの「xxx.html」の部分は検索前の任意の文字列をそのまま残したいのです。 秀丸の置換機能でこのようなことは可能でしょうか? 正規表現に関してあまり詳しくないので教えてください。

  • 正規表現の置換で、カンマで区切られた語句を""と改行で分ける方法

    正規表現による置換についてお教えください。 Unixのコマンドで置換するときに、sed コマンドを使うと思います。 今、プログラムのソースコードの中に含まれている語句を取得するために、色々いじろうと思っています。 私が最もお聞きしたいのは、正規表現の書き方であることを、まずご理解ください。 ソースコードの中に、 string headline="語句1,語句2,・・・,語句n-1,語句n"; というように、 string headline= で始まっていて、 その後に " "(ダブルクォーテーションの組)で囲まれた部分が1箇所あり、 その部分に、カンマ(,)で区切られた語句がいくつもあるような行があったとき、 その " "の部分を、 "語句1", "語句2", ・・・ "語句n-1", "語句n" のように置換したいのです。 つまり、語句一つ一つをダブルクォーテーションで包んで、1行に語句が1つになるようにしたいのです。 厳密に言えば、stringとheadlineの間などに、タブや空白がいくつあるかわからないという問題なども考える必要があるかもしれません。 とりあえず私が考えたのは、 s/\(string headline="\)\([^,]\)+,\(";\)/\1\2",改行"\3/g です。 s/置換前の文字列のパターン/置換後の文字列のパターン/g となっています。 置換前のパターンで \( \) で囲まれている部分は、置換後のほうで、\1のように参照できます。 ■■でも、私の書いたものって、語句が繰り返し出現することに対応できていないように思われます。■■ 実際に、置換に改行を含めるには、正規表現をファイルの中に書いて、sedの-fオプションで読み込ませることになると思います。 string headline=" " という形をしていないものは、たとえ、" " の中がカンマで区切られていてもそれを分けません。

  • 正規表現置換

    はじめまして。 現在、テキストエディタで kami987koroです。(漢字、かな、英数字、半角記号、全角記号、改行、スペースを含む文字列)ありがとうございました。 という文字列を正規表現で拾いだして、置換したいと考えています。 ただ、私がその方面の知識に疎く、どう表記すればよいのか分かりません。 そこで、この分野にお詳しい方、ご教授願えませんでしょうか? よろしくお願い致します。

  • 正規表現と置換を使って書き換えたい

    HTMLのソースなどで、 …省略…width=300 border=10 cellspacing=0 cellpadding=0> …省略…width="300" border="10" cellspacing="0" cellpadding="0"> (スペースの都合で改行しています) と属性値をダブルクォートでくくるように書き換えたいのですが、検索文字列、置換文字列を正規表現を使ってどのように記述すればよいのでしょうか? よろしくお願いします。

  • 正規表現を使用しない置換方法で giオプション

    正規表現を使用せず文字列を置換したいと思っています。 (文字列.replaceはOKだが引数で正規表現は使用せず、単純置換のみ) その際、以下を満たす置換方法はありますか? 1.大文字小文字区別せず 2.検出した箇所すべて 例えば 文字列.split("検出文字列").join("置換文字列") のような方法であれば、2は満たせますが、1が満たせません。 ご回答お待ちしております。

専門家に質問してみよう