2008-03-10から1日間の記事一覧

6.18 1つのパターンでAND, OR, NOTを表現する

ORパターン # /ALPHA/, /BETA/ どちらか一方にマッチする #/ALPHA/ || /BETA/ と同等 /ALPHA|BETA/; /(?:ALPHA)|(?:BETA)/; # このように書くと、必ず両方評価される ANDパターン # /ALPHA/, /BETA/ の両方にマッチしたら真を返す #/ALPHA/ && /BETA/ と同等…

6.17 ネストされている文字列に対して、マッチングを行う

関数呼び出しの引数など、デリミタで囲まれているネストされた文字列に対して、マッチングを行いたい。 マッチング時にパターンを展開して再起的に処理を行う。 my $np; $np = qr{ \( (?: (?> [^()]+ ) # バックトラックを行わない非格納括弧でグループ化 | …

6.16 重複する単語を見つける

ドキュメント内に重複した単語が無いかチェックしたい。 パターンで前方参照を使用する。 $/ = ''; # パラグラフモード while (<>) { while ( m{ \b # 先頭の単語境界 (\S+) # 1個以上の空白文字以外の文字 \b # 末尾の単語境界 ( \s+ # セパレータ(1個以上…

6.23 正規表現集

先頭の2つの単語を入れ替える s/(\S+)(\s+)(\S+)/$3$2$1/; "キーワード=値"形式の文字列からキーワードと値を取得する m/^(\w+)\s*=\s*(.*?)\s*$/; # キーワードは$1, 値は$2 80個以上の文字を含む行を取得する m/.{80,}/; length() >= 80; MM/DD/YY HH:MM:S…

6.20 略語にマッチするパターン

send, abort, list, editといったユーザコマンドがある。これらのコマンドの全ての文字を入力しなくても、コマンドが実行されるようにしたい。 優先順位を付ける方法 chomp($answer = <>); if ("SEND" =~ /^\Q$answer/i) { print "Action is send\n" } elsif…

6.19 有効なメールアドレスにマッチするパターン

ユーザが入力したメールアドレスが有効かどうかパターンを使用して検証したい。 1つの簡単なパターンではメールアドレスが形式的に有効で、さらに配信可能かどうか検証することはできない。従って、いくつかの妥協案のうちの1つを選択する。