• ベストアンサー

Perl 正規表現に関して

現在Perlにて正規表現を用い,アクセス者のログが納めてあるlog.datからデータを検索し集計するといったアルゴリズムです. ところが正規表現を用いたのは良いものの,アルファベット以外をパターンとして使用したとき,データを呼び出すどころか表示されない状況に陥ってしまいました. elsif($referer =~ /abcd/i) { $word2 = "abcd"; } 上記のコードは,パターンがアルファベットで構成されているため,正常にシステムが動作します. elsif($referer =~ /あいうえ/i) { $word2 = "あいうえ"; } しかし,上記のコードはパターンが平仮名で構成されているため,冒頭で記している問題が発生してしまいます. そこで (1)パターンにアルファベット以外のものは使えるのか. (2)パターンにアルファベット以外のものを使いたいときはどうすればいいのか. についてお教えください. また正規表現のほかに,文字列を検索し,頻度をカウントすることに長けているコードがございましたらお教え願います. 以上の内容で不明な点等ございましたら随時対応致します. 宜しくお願いします.

noname#97332
noname#97332
  • Perl
  • 回答数4
  • ありがとう数2

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

正規表現で日本語を扱う場合、Perlでは特別な処理をしてくれないので文字(の組み合わせ)によってはなんらかのメタ文字として認識される場合があるのでそのままでは使えません。 ・正規表現によるマッチングを避ける。 http://digit.que.ne.jp/work/wiki.cgi?Perl%E3%83%A1%E3%83%A2%2F%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%89%B1%E3%81%84#i18 ・メタ文字を無効にする。(正規表現の先頭に\Qを入れる - \Eが含まれるケースを除外しておかないと危ない) http://www.rfs.jp/sb/perl/02/09.html#%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E4%BF%AE%E9%A3%BE%E5%AD%90%E3%81%AE%E4%B8%80%E8%A6%A7 ※頻度によるカウントってのがよくわからないのですが。

noname#97332
質問者

補足

回答ありがとうございます. ご提示なされたURLを参考にしてみます. >※頻度によるカウントってのがよくわからないのですが。 文字列を指定し,与えられたハッシュにどれだけ存在するかを割り出し,それをカウントして値にするといったものを考えております.

その他の回答 (3)

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.4

$str = ' あいうえabcoaお ▲3+'; if( $str =~ /お/ ){ print "マッチ"; }else{ print "マッチしない"; } としたらマッチしたので、アルファベット以外のでもマッチすると思いますが。

noname#97332
質問者

お礼

回答ありがとうございます. 文字コードをいじったらマッチするようになりました.

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

文字コードにさえ気をつければアルファベットだろうとひらがなだろうと漢字だろうとヒエログリフだろうとマッチできる. そして, あなたが文字コードに気をつけているかどうかはこの文面からは分からない. 「頻度をカウントする」のは, 普通はハッシュでしょうね.

noname#97332
質問者

補足

回答ありがとうございます. 質問文足らずですみません.文字コードはEUCとなっております.

  • Suzi
  • ベストアンサー率38% (130/334)
回答No.2

まずは、euc-jp に変えてみてはどうでしょうか。

noname#97332
質問者

補足

回答ありがとうございます. 文字コードはEUC,またlog.datに蓄積されているデータもEUCとなっております.

関連するQ&A

  • 正規表現について

    正規表現について質問をさせていただきます。 VB6.0にて正規表現を使用し、入力された文字のチェックを行っていますが どうしてもうまくいきません。 チェックしたい文字は A(半角アルファベット大文字1文字)または AAA(半角アルファベット大文字3文字)または (AAA)(半角カッコつき半角アルファベット大文字3文字)で 上記3パターン以外はエラーとしたいと思っています。 パターンは下記のように作成したのですが "(^[\(][A-Z]{3}[\)])|(^[A-Z]{1,3})" A、AAA、(AAA)以外でもA(AA)やAAAA等も正常ケースとして通過してしまいます。 パターンをどのように作成すればよいか教えて下さい。 よろしくお願いします。

  • 正規表現ですが・・・

    正規表現なんですが(Perlです。) Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt Bb_abcd.txt 上記のabcdの部分をマッチさせるために (?<=Aa_|Bb_).*(?=_aa|_bb|_cc|\.txt) としてみましたが、これでは Aa_abcd_aa.txt Aa_abcd_bb.txt Aa_abcd_cc.txt のabcd_aaやabcd_bbやabcd_ccとマッチしてしまいます。 なにかよい表現の仕方はありますか? まとめてマッチさせる表現が知りたいです。

  • 正規表現

    正規表現を使って、数字、大文字小文字のアルファベット、「”」(ダブルコーテーション)、「、」コンマ以外の記号を、表せる正規表現方法はどうなるのでしょうか? 見当がつきません。 どなたかお願いします。

    • ベストアンサー
    • Java
  • 正規表現の仕様について

    "abcdefg"という文字列に対して、/a(bc|bcd)/ という正規表現で検索すると 秀丸エディタの正規表現検索では、"abcd"がマッチし、 スクリプト言語のrubyでは"abc"がマッチします。 これは使用している正規表現ライブラリで演算子'|'の評価の仕方が異なるのだと思うのですが、統一された仕様のようなものは存在しないのでしょうか? 他の正規表現ライブラリ間でもこのような細かな動作の違いというのは存在するのでしょうか?

  • 正規表現[0-9]

    ある文字列が大文字のアルファベット(A~Z)で構成されていることを正規表現を用いてチェックしたいと思ってます。 例えば "A0001" という文字列が A~Z で構成されているかを判断しるにはどうしたらよいですかね?? PatternクラスとかMatcherクラスとかを使用するみたいなんですが、なんかよくわかりません。 以下のように動かしたんですが、全く動きません。 boolean result_flag=false; if("A0001"=[A-Z]){   result_flag=true; } Javaおよびプログラム初心者でわかりずらくてすいませんが、 どうかお助けをよろしくお願いいたします。

    • ベストアンサー
    • Java
  • 正規表現で [ ] を探したい

    正規表現の説明のサイトなど、調べてみたのですが、分からなかったのでお聞きします。 現在下記のようなテキストデータがあります。 []は半角カッコです。 ************* : [かきこ] あいうえお ばびぶべぼ [まみむめもI らりるれろ かきくけこ : ************* OCR処理をしている為、カッコ"]"が"I"大文字半角のアイになっている箇所があります。 その間違いを捜し当てたいのですが、 [ I I ] I I の3パターンあると思うのですが、それぞれを探せる正規表現を教えていただけないでしょうか? どなたかご教授願います。

  • .NET正規表現で(?=...)を使えない?

    お世話になります。 以下のページ(.NET Framework 開発者ガイド>グループ化構成体) http://msdn.microsoft.com/ja-jp/library/bs2twtah(VS.80).aspx に、.NET正規表現について以下のようなパターンがあります。  (?= subexpression) ゼロ幅の正の先読みアサーションです。(略)  (?! subexpression) ゼロ幅の負の先読みアサーションです。(略)  (?<= subexpression) ゼロ幅の正の後読みアサーションです。(略)  (?<! subexpression) ゼロ幅の負の後読みアサーションです。(略) これらは、あるパターンが注目している前/後に現れる/現れないかどうかをチェックするけど、それらをキャプチャーしないというものです。 これを使いたいのですが、使えません。以下はVBScriptのプログラムで、WSCript 5.6および5.7で動作させました。(インデントを表現するために全角空白を使っています。実際に動かしてくださる方はタブ文字かなにかに変換願います) Option Explicit Dim objRegExp ' 正規表現オブジェクト Dim objMatches ' 検索結果 Dim objMatch ' 検索結果 Dim strMessage ' 表示メッセージ Set objRegExp = New RegExp objRegExp.Pattern = "(?<=「)[^」]+(?=」)" objRegExp.IgnoreCase = True objRegExp.Global = True Set objMatches = objRegExp.Execute("カッコ前「カッコ中」カッコ後") WScript.Echo objRegExp.Pattern & " は" For Each objMatch In objMatches  strMessage = " " & objMatch.FirstIndex + 1 & _   " 文字目に見つかりました。" & _   "一致した文字列は " & objMatch.Value & " です。"   WScript.Echo strMessage Next Set objMatches = Nothing Set objRegExp = Nothing ところが、  objRegExp.Pattern = "(?<=「)[^」]+(?=」)" のところで「正規表現で構文エラーになりました」となります。 これを、もっと簡単なパターン、  objRegExp.Pattern = "(?:「)[^」]+(?:」)" とすれば動くことは分かっているんですが、今の私の主眼としては「(?<=...)」および「(?=...)」を使いたいんです。 他に、Word 2007 の VBA を試しましたがダメでした。 正規表現自体は合っているようです。 というのは、以下のテストツールで動作できたからです。 http://www.ultrapico.com/Expresso.htm ということで、これらの新しい .NET 正規表現を VBScript や VBA で動かす方法はあるでしょうか。 よろしくお願いいたします。

  • 正規表現で分かりません

    例えば以下のようなパターンの正規表現チェックがあるのですが、 どのようなものを意味しているか分かりません。 教えていただけますでしょうか。 よろしくお願いします。 以下の情報は調べたのですが。 +(プラス)・・・直前の1文字の1回以上の繰り返しを表現 . (ピリオド)・・・改行コード以外の1文字にマッチするか否か [ ](大括弧)・・・囲みの中に書かれた任意の1文字にマッチするか否か ^([^ ]+) +[^ ]+.+S3.lzh

  • 正規表現の表現パターンについて教えて下さい。

    こんばんわ、正規表現を使ってある文字列を検索するプログラムを勉強していたのですが、 eregi('(http://|https://)[a-z0-9./_\-]+',第二引数、第三引数) となっていたのですが、第一引数の最後の + の部分はどうゆう意味があるのでしょうか? 僕の理解では[ ]の間が検索する正規表現のパターンだと思っているのですが、、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 正規表現で「除く」

    windows用のエディタの「VIVI」というのを使っています。 grepで「2002/09/01」という文字列を含まないテキストを検索したいのですが、正規表現での検索の方法を教えていただけないでしょうか。 #どのエディタも同じではないかもしれませんが。 #自分は、正規表現のことは素人です。単に上記条件の日付のみを変更して使いたいだけ・・ (^^;

専門家に質問してみよう