Perlの正規表現で条件分岐する方法

September 19,2014 12:55 AM
Category:[正規表現]
Tag:[Perl]
Permalink

Perlの正規表現で条件分岐する方法を紹介します。

1.Perlの正規表現で条件分岐する

たとえば文字列の先頭に「"」が存在する場合、文字列の末尾に「"」が必須であるパターンと、「"」がないパターン、

"foo"

foo

の両方にマッチさせたい場合の正規表現は次のようになります。

^(")?(?(1)\w+"|\w+)$

サンプルコード

#!/usr/bin/perl
 
use strict;
use warnings;
 
my $str = '"aaa"';
if ( $str =~ /^(")?(?(1)\w+"|\w+)$/ ) {
    print "match";
} else {
    print "not match";
}

解説です。まず、

^(")?

で、先頭にダブルクォーテーション「"」が1文字(または0文字)存在することを判定します。

次に、

(?(1)

で、グループ(ここでは1)にマッチすれば真となります。つまりダブルクォーテーションが存在すれば真となります。

\w+"|\w+

そして、さきほどの結果が真であれば「\w+"」を実行し、偽であれば「\w+」を実行します。

認識誤りがあったらどこかでつぶやいてください。

下記の例では文字の並びをチェックします。

my $str = 'ATGAAG'; # GATGGC/TAGBBC
if ( $str =~ /[ATGC]+(?(?<=AA)G|C)$/ ) {

$strに設定する文字が「ATGAAG」であれば

(?<=AA)

にマッチし、「GATGGC」であれば戻り読み「(?<=AA)」にはマッチしませんが正規表現にはマッチします。

「TAGBBC」の場合は正規表現にマッチしません。

なお上記の戻り読み、あるいは先読み・コード表明の場合、次のように条件部分をカッコで囲む必要はないようです。

(?((?<=AA))G|C)

2.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

JavaScriptメールアドレスチェッカー

September 18,2014 12:33 AM
Category:[JavaScript]
Tag:[JavaScript, Mail]
Permalink

JavaScriptのメールアドレスチェッカーを作ってみました。

JavaScriptのメールアドレスチェッカー

記事を書くにあたって、メールアドレスについてのRFCや関連記事をざっと調べてみました。

結果、どういったバリデーションチェックがよいのか落としどころがみつかってませんが、単純にJavaScriptで正規表現を使って動くものを作ってみたいと思っただけなので、ゆるいチェック(現実的)とややきびしいチェックの2つに対応させてみました。

1.メールアドレスチェッカー

下記のフォームからモードを選択し、メールアドレスを入力して「チェック」をクリックすれば検証結果を表示します。

ゆるい(現実的) きびしい

結果:

ゆるい方のチェックは次のとおりです(抜粋)。

$(function(){
    $('#check').click(function(){
        var address = $('#address').val();
        if (address.match(/^[^@]+@.+\..+$/)) {
            $('#result').text("OK");
        } else {
            $('#result').text("NG");
        }
    });
});

きびしい方のコードは次のとおりです(抜粋)。

$(function(){
    $('#check').click(function(){
        var address = $('#address').val();
        if (address.match(/^(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))$/i)) {
            $('#result').text("OK");
        } else {
            $('#result').text("NG");
        }
    });
});

きびしい方のチェックで用いている正規表現は、「Comparing E-mail Address Validating Regular Expressions」にあるPHPのfilter_varの検証用フィルタFILTER_VALIDATE_EMAILを利用しています(Dフラグはサポートされていないので外しました)。

よってPHPの下記のコードと同じ結果が得られると思いますが、認識が間違っていたらどこかでつぶやいてください。

<?php
if ( filter_var($address, FILTER_VALIDATE_EMAIL) ) {
    echo "OK";
} else {
    echo "NG";
}
?>

RFCモードでバリデーションOKにならないメールアドレスもあるので、詳しくは参考記事を参照ください。

2.参考サイト

参考サイトは下記です。ありがとうございました。

Comments [0] | Trackbacks [0]

:not擬似クラスでCSS3のサポートをチェックする方法

September 17,2014 12:03 AM
Category:[CSS]
Tag:[CSS]
Permalink

CSS3の:notで擬似クラスのサポートをチェックする方法を紹介します。

:not擬似クラス

1.はじめに

:checked擬似クラスでチェックボックスに連動して要素を表示させる方法」で、CSSの:checked擬似クラスを使ってチェックボックスの操作に連動してテキストエリアの表示を制御する方法を紹介しました。

前述の記事の再掲になりますが、HTMLとCSSの設定は次のとおりです。

<style>
.bar {
    display: none;
}
input:checked + label + div {
    display: block;
}
</style>
<div>
  <input id="foo" type="checkbox" name="foo">
  <label for="foo">foo</label>
  <div class="bar">
    <label for="bar">bar:</label>
    <input id="bar" name="bar" type="text">
  </div>
</div>

がこの設定では、:checked擬似クラス(というかCSS3)をサポートしていないブラウザで、"display:block"が有効にならず、テキストエリアが表示されないという問題が残ります。

2.:notで擬似クラスのサポートをチェックする

1項の問題を解決するには、上記のCSSに:notを次のように設定します。

<style>
.bar:not(old) {
    display: none;
}
div:not(old) input:checked + label + div {
    display: block;
}
</style>

この設定を行うことで、:notをサポートしていないブラウザはここに掲載したセレクタが適用されず、結果としてテキストエリアがデフォルトで表示されます。

逆に:notをサポートしているブラウザは、:notに指定した値「old」に常にマッチしないので、記述したセレクタがデフォルトで適用されることになります。

3.:notについて

:notは「否定擬似クラス」といい、指定した要素以外のすべてに適用する機能があります。

ここでは「old」という存在しない要素を指定しているので、:notをサポートしているブラウザでは常に適用される結果になります(ただしCSS3擬似クラスのサポートはブラウザ依存)。

このエントリーで紹介した:notは本来の使い方ではありませんが、ネットをチェックすると:not自体の紹介はされていても、実践的な使い方に言及されている記事がなかったので、ひとつのテクニックとして覚えておくと便利かもしれません。

4.参考サイト

参考サイトは下記です。ありがとうございました。

Hiding CSS rules with the negation pseudo-class

Comments [0] | Trackbacks [0]
 1  |  2  |  3  |  4  |  5  | All pages