プロが教える店舗&オフィスのセキュリティ対策術

辞書の訳語を表示する際、正規表現を使って、次の文字列を含む文字列をゴシック表示しようとしています。
そこで次のようにしたのですが、1行目はうまく置換されますが、2行目は全く駄目です。
$yakugo =~ s/(\[再帰\]|\[現分\]|\[代動\]|\[過分\]|\(再\)|\[規則変化\]|\[不規則変化\])/<B>$1<\/B>/g;
$yakugo =~ s/(\[\W+と共に\]|\[\W+詞\W+\]|\[次の\W+\]|\[ふつう\W+\])/<B>$1<\/B>/g;

2行目のような置換の仕方は規則破りなのでしょうか?済みませんが、どなたか、これに替わる書法で、2行目のような意図を達成する正規表現の式をお教え下さい。

A 回答 (3件)

こんな感じになりました。



$yakugo =~ s/(\[[^\[]*と共に[^\]]*\]|\[[^\[]*詞[^\]]*\]|\[次の[^\]]*\]|\[ふつう[^\]]*\])/<B>$1<\/B>/g;
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/09/20 20:05

追記。


ちょっと縮めて見ました。

$yakugo =~ s/(\[[^\[]*)(と共に|詞|次の|ふつう)([^\]]*\])/<B>$1$2$3<\/B>/g;

ただ、これだと[正確がふつうなひと]というように前後に他の言葉が入った場合でもHITしてしまいますが。
    • good
    • 0
この回答へのお礼

ありがとうございました。
<ただ、これだと[正確がふつうなひと]というように前後に他の言葉が入った場合でもHITしてしまいますが。

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

お礼日時:2004/09/20 15:36

[^\[]*


これは、

\[ 以外の文字、となります。

それ([]の中の文字 を *で)が0個以上続いた といった意味です。


[^\[]+ とすると前後に何か文字がはいってないとHITしないので。
(+が一つ以上という意味なので)

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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!