タグ

perlと正規表現に関するtzccinctのブックマーク (15)

  • Unicodeプロパティを使ったPerl正規表現 - Hatena Developer Blog

    こんにちは、Webアプリケーションエンジニアのid:nanto_viです。 Webアプリケーションを作っていると、「全角文字と半角文字を統一したい」「ユーザーの入力から漢字を抜き出したい」といったテキスト処理を行う場面にたびたび遭遇します。はてなではWebアプリケーションのサーバー側プログラミング言語としてPerlを多く使っていますが、PerlならこのようなときにUnicodeプロパティを用いた正規表現パターンで柔軟な処理が可能です。 Unicodeプロパティ 現在、ほとんどのプラットフォームで採用されている文字集合がUnicodeです。Unicodeでは文字だけでなくその文字の様々な特性(プロパティ)も定められており、テキスト処理の基礎情報として活用できます。 Perl正規表現でのUnicodeプロパティの利用 Perlの正規表現では、\p{Property_Name=Value}のよう

    Unicodeプロパティを使ったPerl正規表現 - Hatena Developer Blog
  • tokuhirom blog

    Blog Search when-present<#else>when-missing. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)?? ---- ---- FTL stack trace ("~" means nesting-related): - Failed at: ${entry.path} [in template "__entry.ftlh" at line 3, column 25] - Reached through: #include "__entry.ftlh" [in template "entry.ftlh" at

  • Perl の正規表現の「名前付き捕捉」がとても便利

    Perl の正規表現の「名前付き捕捉」がとても便利 2014-08-07-1 [Programming] Perlの正規表現で「名前付き捕捉」を使うと、マッチした部分に名前をつけておけるのであとから参照するときに便利。 「(?<name>...)」でマッチさせると、ハッシュ「%+」に保存されて、「$+{name}」でアクセスできるのです。同じ正規表現内では「\g{name}」など。 サンプルプログラムです。日付表現にマッチしたら、年、月、日をそれぞれ別途格納。そしてそれを正規化して出力。 サンプルプログラム: #!/usr/bin/env perl use strict; use warnings; while (<DATA>) { chomp; if (m{ (?<Y>[0-9]{4})\s?年\s? (?<m>[01]?[0-9])\s?月\s? (?<d>[0-3]?[0-9])\s

    Perl の正規表現の「名前付き捕捉」がとても便利
  • 【第638回】正規表現の先読み、後読みのアサーション : イジハピ!

    2014年07月09日19:45 【第638回】正規表現の先読み、後読みのアサーション カテゴリすぐわかる気がするPerl query1000 Comment(0)Trackback(0) 正規表現による検索置換を使っていて突き当たる問題として、ある条件の時のみ検索置換を行いたい、ということがある。 たとえばIT用語で、カタカナ列の末尾にある音引き(ー)を取りたいとする。 (ちなみにぼくは、以前書いたが、IT用語の末尾の音引き削除は意味のない習慣で、やめるべきだと思っている。最近はマイクロソフトをはじめ音引きを付ける企業も多い) (置換前)コンピューターが使えて便利だ (置換後)コンピュータが使えて便利だ 単純に「ー」を全削除すると (置換後)コンピュタが使えて便利だ となってしまう。 そこで、カタカナ以外の前にある音引きを削除する、と考える。 しかし、カタカナ以外の1文字は[^ァ-ン]だ

    【第638回】正規表現の先読み、後読みのアサーション : イジハピ!
  • regexp - ^$でなくて\A\zを使おう : 404 Blog Not Found

    2009年03月09日00:30 カテゴリLightweight LanguagesTips regexp - ^$でなくて\A\zを使おう まずは回答から。 正規表現で「制御文字以外」のチェック - ockeghem(徳丸浩)の日記 文字エンコーディングの妥当姓 制御文字(\x00〜\x1f, \x7f)のチェック 文字列長のチェック このうち後ろ二つを正規表現として書くにはどうすればいいかを考えていました。 こういう時には、「全文字がOKならOK」と考えるのではなく、「一文字でもNGならNG」と考えると楽になります。それは「スペースと非制御文字以外」なのですから、/[^ \S]/が求めていた正規表現で、=~ではなく!~が使うべき演算子ということになります。全角スペースもOKにしたければ、/[^ \x{3000}\S]/。[追記参照] [Run via Codepad] #!perl -

    regexp - ^$でなくて\A\zを使おう : 404 Blog Not Found
  • 正規表現によるバリデーションでは ^ と $ ではなく \A と \z を使おう

    正規表現によるバリデーション等で、完全一致を示す目的で ^ と $ を用いる方法が一般的ですが、正しくは \A と \z を用いる必要があります。Rubyの場合 ^ と $ を使って完全一致のバリデーションを行うと脆弱性が入りやすいワナとなります。PerlPHPの場合は、Ruby程ではありませんが不具合が生じるので \A と \z を使うようにしましょう。 はじめに 大垣さんのブログエントリ「PHPer向け、Ruby/Railsの落とし穴」には、Rubyの落とし穴として、完全一致検索の指定として、正規表現の ^ と $ を指定する例が、Ruby on Rails Security Guideからの引用として紹介されています。以下の正規表現は、XSS対策として、httpスキームあるいはhttpsスキームのURLのみを許可する正規表現のつもりです。 /^https?:\/\/[^\n]+$/

  • Perlの m// は中身が固定文字列だと爆速になる - Islands in the byte stream (legacy)

    [追記] 実際に検証してみると、パターンが短いと index() のほう速いこともあるようです。パターンが長いと正規表現のほうが高速になるのでそもそもアルゴリズムが違うようですね。 よってこのエントリの内容は必ずしも正確ではありません! cf. https://gist.github.com/kazuho/5410635 [/追記] Perlの話題を日語で – Lingr で出た話題です。 Perlの正規表現マッチはパターンが単純だと index() とおなじく Boyer-Moorアルゴリズムで検索するので非常に高速です。要は最適化のつもりでパターンマッチをindex()に書き換えるのは無意味なのです。 ソースは pp.c や regexec.c あたりを fbm_instr() で検索かな? ドキュメントもどこかで読んだ気がするのですが思い出せず>< perl -MDevel::Pe

    Perlの m// は中身が固定文字列だと爆速になる - Islands in the byte stream (legacy)
  • 正規表現のキャプチャ - アリ

    正規表現のキャプチャの結果を取得したいときには、次のようなコードを書く: if (my @capture = '10/17' =~ m!([0-9]{2})/([0-9]{2})!) { # @capture = (10, 17) } $1や$2を使っても取得はできるが、キャプチャが増えたときに$1, $2, $3, $4, ...と増やしていくのは苦行である。 このようにすると、@captureにキャプチャの結果が入る。しかし、キャプチャの括弧がない正規表現の場合、@captureの値はどうなるのか。 if (my @capture = '10/17' =~ m![0-9]{2}/[0-9]{2}!) { # @capture = (1) } キャプチャされていないのに、@captureには(1)が代入されている。空リストはfalse扱いなので、こういったケースのために(1)を返すみたい

    正規表現のキャプチャ - アリ
  • ものかの » 正規表現の略記法 \d と \s と \w

    正規表現の文字クラスの略記法 \d と \s と \w がいつのまにかアレレなことになっていたのでメモ。(1 Perl 5.8 以降で正規表現を使うには use utf8 が必須。 use utf8 では \d と \s と \w の文字クラスの内容が Unicode のカテゴリーに基づいている。 InDesign(Boost)も同様。 PCRE や Ruby は変わりなし。 (2 参考資料:perldoc の perlrecharclass 参考資料:Programming Perl の 5.4. Character Classes ちょっと詳しく見ていきます。 *以降、Perl = use utf8 の Perl ほとんど全ての人が [0-9] の10文字として使っていますが、Perl では \p{Nd} です。ただし、Perlのバージョンによって(対応しているUnicodeバージョン

    ものかの » 正規表現の略記法 \d と \s と \w
  • 日本語の自然言語処理には Perl も便利 - アスペ日記

    小ネタ。Perl で日語の簡単な処理をするやり方(こういうことが簡単にできるという例で、具体的なオプションの意味等は解説していない)。 コマンドラインでちゃちゃっと日語の処理をしたい時、Perl はけっこう役に立つ。日語の一文字を一文字として扱えるから。特に、コマンドラインやファイルのエンコーディングを UTF-8 で統一しておくといい。 例えば、ひらがなの単語リストを読み込んでカタカナにするには、次のようにすればいい(「ヴ」は扱い方によって変わるので省略)。 perl -CS -Mutf8 -ple 'tr/ぁ-ん/ァ-ン/' < in.txt > out.txt カタカナの単語リストの最初の一文字を濁音から清音にしたいということがあるかもしれない。そういう時はこうする(「ヴ」については同上、半濁音の処理も略)。 perl -CS -Mutf8 -ple 's{^(.)}{my $

    日本語の自然言語処理には Perl も便利 - アスペ日記
    tzccinct
    tzccinct 2011/08/27
    「「カタカナだけ」と思って処理をする時、実際は「ー」も含めたい場合が多い。」
  • Perl5 で半角カタカナにマッチする正規表現を簡単にかく方法について - tokuhirom's blog

    にしても、こちらのサイトでも言われていますが、なぜ半角カナ専用のUnicodeブロックがないのかと小一時間(ry http://blog.livedoor.jp/sasata299/archives/51194035.html http://d.hatena.ne.jp/pasela/20081003/ll_unicode ということで、 sub InHankakuKatakana { "FF65\tFF9F" }という一行をはっつけると、つかえるようになりますね。 #!/usr/bin/perl use strict; use warnings; use utf8; use Test::More; sub InHankakuKatakana { "FF65\tFF9F" } ok("\x{FF65}" =~ qr/\p{InHankakuKatakana}/); ok("abc" !~

  • 404 Blog Not Found:perl - 勝手に添削 - 40行で作るPerl用テンプレートエンジン

    2007年10月30日20:00 カテゴリLightweight Languages perl - 勝手に添削 - 40行で作るPerl用テンプレートエンジン 久々の勝手に添削。今回はこちら。 40行で作るPerl用テンプレートエンジン 正規表現がらみなので、Perl以外でも有用。 添削箇所は、こちら。 40行で作るPerl用テンプレートエンジン sub convert { return unless defined(my $str = shift); $str =~ s{&amp;}{&amp;}gso; $str =~ s{<}{&lt;}gso; $str =~ s{>}{&gt;}gso; $str =~ s{\"}{&quot;}gso; $str; } これの最初のsubstitutionが&amp;ではなくて&ではないかというのはさておき、こういった場合、何度も正規表現をかけ

    404 Blog Not Found:perl - 勝手に添削 - 40行で作るPerl用テンプレートエンジン
  • 正規表現のデバッグ方法 - こんにちはこんにちはmonmonです!

    re=debugってやると詳細出してくれるの知らなかったのでコピペ。 Perlコーディング初心者質問スレ Part 62 502+1 :nobodyさん [] :2011/05/02(月) 02:42:13.10 ID: fV7VGj7j (1/2) 「文字列A        文字列B」 という 2 つの文字列の間に複数の空白がある行において /\s*/ でマッチさせると、変数 $` (=$PREMATCH) には何も入りませんでした なぜでしょうか? 入門書は「パターンマッチが複数解釈出来る場合には一番長い解釈にマッチする」とあります。 よって自分は \s* という「0 回以上のホワイトスペースの繰り返し」は 最も長い解釈では複数の空白にマッチし $` には文字列A が代入されるはずだと考えたのですが 503+1 :1/2 [↓] :2011/05/02(月) 03:50:24.42 I

    正規表現のデバッグ方法 - こんにちはこんにちはmonmonです!
  • /gcと\Gを使って複数の正規表現式でトークンを少しずつ削りとる - Islands in the byte stream (legacy)

    複数の正規表現式で文字列からトークンを切り出したいことがある。しかし、以下のコードは動かない。無限ループになってしまう。 #!perl -w # THIS DOES NOT WORK!!! use 5.10.0; use strict; use utf8; my $s = 'foo bar baz FOO BAR BAZ'; while( 1 ) { if( $s =~ /\b (f..) \b/xmsig) { # first matching expression say $1; } elsif( $s =~ /\b (b..) \b/xmsig) { # second matching expression say $1; } else { die 'finished'; } } これは[twitter:@akajiro]さんと[twitter:@hio]さんに教えてもらった結果、解

    /gcと\Gを使って複数の正規表現式でトークンを少しずつ削りとる - Islands in the byte stream (legacy)
  • 404 Blog Not Found:perl - Regexp::Assembleのススメ

    2007年04月19日15:00 カテゴリLightweight Languages perl - Regexp::Assembleのススメ というわけで、Regexp::Assembleのご紹介。 PERL HACKS(日語版) [英語版] odz buffer - それ Regexp::Assembleん?ループ云々を抜きにして、こういうのは Regexp::Assemble の出番じゃないの? すでにPerl Hackers御用達のモジュールとなっていますが、まだ知らない方もいらっしゃるかも知れないので。 何をするモジュールか、といえば、以下を見れば一目瞭然でしょう。 Regexp::Assemble - Assemble multiple Regular Expressions into a single RE - search.cpan.org use Regexp::Asse

    404 Blog Not Found:perl - Regexp::Assembleのススメ
  • 1