• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:日本語での正規表現について)

日本語での正規表現について

このQ&Aのポイント
  • 正規表現を使用して「***************** Version 2 *****************」という文字列から「2」を取得したいが、日本語文字列ではうまく動作しない。どのようにエンコードすれば良いか教えてください。
  • 「***************** バージョン 2 *****************」という文字列から「2」を取得するために正規表現を使用したが、日本語文字列に対して正しく動作しない。バージョン以外の日本語文字列も同様にマッチさせるための変換方法を教えてください。
  • 与えられた文字列に含まれる「バージョン」という文字の文字コードはSJISです。WebやWindows上のアプリケーションで指定文字列を変換する方法を教えてください。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

一応、検索に有効なキーワードを入れてあったんだけど > Unmatched [ in regex; marked by <-- HERE in m/^\*+\s*バー 「ダメ文字」で検索。例えば http://sites.google.com/site/fudist/Home/grep/sjis-damemoji-jp ーに[が含まれているため、ここで[が始まっているのに対応する]が無い、というエラー。 []で括ってあったときは、[の中に[を書くと、「[という文字」の意味になるので、エラーにならなかった。 ー[] とすると、 「ー」の1バイト目+ [[] となって、「ー」の1バイト目+「[という文字」 となって、ーにマッチする。 あるいは、\Q \Eでメタ文字を無効にする。 > そのややこしい部分をどのように記述すればよいのかを質問したつもりでした。 「perl unicode」で検索。例えば、以下のところとか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.rwds.net/kuroita/program/Perl_unicode.html

tetuya120
質問者

お礼

回答ありがとうございます。 下記のように\Qと\Eで該当文字を囲む事で正しい結果が得られました。 /^\*+\s*\Qバージョン\E\s+(\d+)\s*\*+\s*$/

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

> /^\*+\s*[バージョン]\s+(\d+)\s*\*+\s*$/ なんで [バージョン] と [] がついてるのでしょうか? 最初のを[Version]としたらどんなことになるか、おわかりでしょうか? > perlはほぼ使えないため、WebやWindows上でのアプリケーションで指定文字列を渡すと変換できる物をお願い致します。 > (perlは入っているためコマンドを叩けばOKというのであればそれでも構いません) すみません。おっしゃってることの意味がわかりません。 なにからなにに変換するのでしょうか? > 与えられる「バージョン」という文字の文字コードはSJISになります 入力もPerlのスクリプトもShift_JISで書かれているのなら、以下の点に注意すればそのまま記述するだけです。 ・日本語一文字は2バイトの文字の並びだと解釈される。 固定の文字列ならあまり問題無い。 *,+等の量指定子、[]等の文字セットでは、注意が必要。量指定子は後半の1バイトだけの繰り返し、[]では前半の1バイトか後半の1バイトのどちらかにマッチする、という意味になる。 ・いわゆる「ダメ文字」がある。よく言われる\以外にも、リストを表す@、正規表現で使われるメタ文字も対象になるので、かなりの文字が該当する。 日本語も一文字として扱いたいのなら、Unicode文字列として変換して...となります。 どうするかはややこしいので検索でもして調べてください。

tetuya120
質問者

お礼

お答えありがとう御座います。 No.1の方のお礼に書かせていただきましたが、「[」、「]」は不要でした。 >なにからなにに変換するのでしょうか? perl内ではsjisは使用できないかと思い、何らかの文字コードに変換するのかと思い書かせていただきました。 >どうするかはややこしいので検索でもして調べてください。 そのややこしい部分をどのように記述すればよいのかを質問したつもりでした。 >固定の文字列ならあまり問題無い。 とのお答えもありましたが、No.1の方のお礼に書いたとおりどうにもうまくいきません。 意図がわかりずらい文章で申し訳ありませんが、よろしくお願い致します。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

フリーのサクラエディタ(http://sakura-editor.sourceforge.net/)の 検索・置換の正規表現では 「^\*+\s*[バージョン]\s+(\d+)\s*\*+\s*$」でなく 「^\*+\s*バージョン\s+(\d+)\s*\*+\s*$」であればOKです。 (サクラの検索・置換では”/”は不要) 日本語の周りの”[”、”]”は不要では?

tetuya120
質問者

お礼

お答えありがとう御座います。 確かに「[」、「]」は不要でした。 「/^\*+\s*バージョン\s+(\d+)\s*\*+\s*$/」として実行した所↓のエラーがでました。 「Unmatched [ in regex; marked by <-- HERE in m/^\*+\s*バー <-- HERE ジョン\s+(\d+)\s*\*+\s*$/ at 」atの後は略させていただきました。 こちらで調べた所「ー」は「\ー」としろという情報がありましたのでこちらも試しましたが、うまくいかない状態です。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 正規表現について

    お世話になります。 ●●● ●●● という文字列かどうか判断する正規表現を作成したいです。 条件としては、 ・「文字1 (←全角スペース)文字2」という感じで、文字1と文字2に全角スペースが挟まれている感じで、文字列の先頭にも末尾にも空白文字は入ってはいけない(真ん中に1つのみ) ・文字1と文字2には、数字・空白以外の文字が入る(主に感じ・ひらがな・カタカナが入る)(文字数は一文字以上) といったところです。 自分で作成した正規表現は、 $pattern = '/^([\d\S])+ ([\d\S])+$/'; if( !preg_match($pattern,$chkStr) ) print "マッチしていない"; } なんですが、どうもマッチしてほしい文字にマッチしていないようなのです。 お手数ですがご教授ください。

    • ベストアンサー
    • PHP
  • 正規表現の実行レポートは作成可能でしょうか?

    開発言語:Perl(Win32) ヴァージョン:5.8.4.810 perl.exeのプロパティー参照 長文の正規表現にパターンマッチを試みているのですが、 本来マッチするはずの文字列に対して、マッチしません。 しかし、正規表現が長文のため、なかなかデバッグが進みません。 どのように、パターンマッチが進んでいるか見ることが出来ればデバック作業が早くなると思うのですが、 私はその方法を知りません。 そこで、質問なのですが、Perlが正規表現をどのように解釈して、パターンマッチを進めているか、確認する方法はないのでしょうか? できれば、パターンマッチ実行中、解釈している位置と、文字列をレポートとして出力する方法があれば、それを知りたいと思います。

    • ベストアンサー
    • Perl
  • 日本語のマッチング(正規表現)

    Perl5.8.7で日本語のマッチングを行おうとしてます. 文字コードはEUCで,[ト],[ユ],[ャ],[ュ]や[ョ] の後にある[ウ]を[ー(長音)]に変換しようとする ものです. 例.ヒャクトウバン→ヒャクトーバン 自分の考えた正規表現では成功しませんでした. if($b[$i] =~ /[\xa5e6\xa5c9\xa5e3        \xa5e5\xa5e7]\xa5a6/){ $b[$i] =~ s/\xa5a6/\xa1bd/; } 文字コードを直接書く方法しかないのか, 日本語はマッチングできるのかなどわからないので, よろしくお願いいたします.

    • ベストアンサー
    • Perl
  • 正規表現での$1や$2の使用方法

    正規表現の置き換え文字列部分で使用できる$1や$2の使用方法を教えてください! 以下のソース1のようにs///gの置き換え文字列部分に$1や$2を直接記述すれば、1つ目と2つ目のマッチ部分で置換が行われるのは確認しました。 しかし、ソース2のように置き換え文字列部分を変数に代入したのち、使用すると、正しく置換が行われません。 $1や$2を含んだ置き換え文字列を変数に持っている状態で、ソース1と同じ結果を得るにはどうしたらよいか、ご存知でしたら教えて下さい。 ############################## # ソース1 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $data =~ s/$ptn/$1-$2/g; ############################## ↓ $dataは123-4567となる。 ############################## # ソース2 ############################## #!/usr/bin/perl $data = '1234567'; $ptn = '(\d{3})(\d{4})'; $str = "$1-$2"; $data =~ s/$ptn/$str/g; ############################## ↓ $dataは-となる。

    • ベストアンサー
    • Perl
  • 正規表現で日本語文字化け

    winxp でrubyの勉強をしていますが、正規表現により分割した日本語の文字列を処理するときにどうしても文字化けしてしまいます。 環境はwinxp pro,activeruby 1.8.6, RDE 1.1.1.1 です。実行しようとした内容は ”蛸 110円”など名前と金額の組み合わせが複数行乗っているテキストファイルを読み込、以下の正規表現で名前と金額を別々の配列に格納しています。 if /(\w+)\s+(\d+)/e =~line menu[i]=$1 price[i]=$2 ・・・ 上記の処理では 変数line は正常に日本語を格納していますが、$1には”蛸”ではなく文字化けした状態で値がセットされています。 ソースの先頭には $KCODE=Ks を記載し、読み込むファイルもソースファイルもSJISで揃えました。 上記以外にどのような点に留意すればよいのか、そもそも認識が間違っている点があるかなどご指摘いただければと思います。よろしくお願いします。

  • 正規表現について

    /^R|ruby$/ 上記のような正規表現があったとします。 この正規表現の【|】の判断がわかりません。具体的には、/^ $/という記述から 対象の文字列の先頭がRかrのどちらかで以降がubyと続く文字列にマッチという 意味だと解釈しているのですが違うのでしょうか? 具体的にはRubyという文字列かrubyという文字列の二つのうちどちらかにしか マッチしないとおもっていたのですが、 rrubyという文字列やRrubyという文字列にもマッチします。そもそもこの場合のR|rの箇所ですが、これはRかrのどちらかが先頭にあり 二文字目からはubyという文字列がつづきますよ。という正規表現ではないのでしょうか? かなりこまっています。 識者のかたご教授ください。

  • 正規表現を教えてください。

    正規表現を教えてください。 C#で正規表現を用いた文字列検索を勉強中なのですが、うまくマッチさせることができません。教えていただけないでしょうか。 検索対象の文字列は下のようになります。 キーワード;値; 文字列中に該当するキーワードが存在する場合に、その値を取得するプログラムを考えています。しかし、私の正規表現では2つ目の「;」を検出してしまい、キーワードのみを取得することが出来ずに困っています。 見当違いの表記をしているとは思うのですがどなたかお助けください。 match = Regex.Match(line, "^(.*);"); C#初心者なものです。

  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • perl 正規表現 抽出

    perl の正規表現を用いて、文字列の抽出を行いたいのですがどのように 書けばいいのかわかりません。 実現したいことは 「Y:/フォルダ名/フォルダ名/ファイル名.拡張子」 というテキストに対して 「拡張子」のみを抽出することと 「ファイル名」のみを抽出することです。 パターンマッチや変換はなんとなくわかるのですが 抽出の仕方がよくわかりません。 よろしくお願いいたします。

    • ベストアンサー
    • Perl