JavaScript/正規表現

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

正規表現(せいきひょうげん、regular expression)とは、パターンマッチです。JavaScriptの正規表現はPerl正規表現に影響を受けています。

使用例[編集]

JavaScriptにかぎらず、おおむね1990年以降のモダンなプログラム言語には下記のように、文字列を検索する機能が普通あります。

下記のコード自身は正規表現ではないのですが、前提として下記の関数を使えないと正規表現を活用できないので、先に下記のコードを学びましょう。


コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "books";
  var b1 = aaa.search("k");
  document.write((b1+1) + "文字目にある。" + "<br>" );
</script>
結果
4文字目にある。

JavaScriptでは、まず文字列オブジェクトのsearchプロパティによって、文字列の何文字中に、検索したい文字列があるかという位置の情報を返します。

※ プログラム言語ごとに search の役割が違うので、混同しないように。たとえば Python というプログラム言語の saerch 関数は全く別の機能である。

JavaScriptのsearchプロパティでは先頭の文字を0文字目として数えるので、上記コードでは +1 しています。


正規表現とは[編集]

正規表現とは、下記のコードの「/k/」の部分です。JavaScriptにかぎらず(Perlなどの)プログラム言語では一般に正規表現はスラッシュ記号(/)で囲まれます。

検索などの関数(下記コードのtestが検索のための組み込み関数)を組み合わせる際、JavaScriptを含む幾つかのプログラム言語では正規表現が使われます。

下記コード例の場合なら、検索される「books」文字列中に正規表現「/k/」で指定する「k」が含まれているので、論理式 s.test(aaa) が真です。

test プロパティは、検索した文字列が含まれているかどうかの真偽を返すプロパティです。testは、検索対象が含まれている場合に真を返し、含まれていない場合に偽です。

testプロパティの書式は

含まれる文字列.test(検索される側の文字列)

です。(初心者は、含まれる文字列ガワと検索ガワの順序を逆に勘違いしやすいので、注意しましょう。)


コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "books";
   var s = /k/ ;
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>


結果
含まれている。


正規表現は、単独では使うことはマレで、普通は検索などの関数とともに使われます。

正規表現リテラル[編集]

正規表現は、スラッシュ"/"の間に記述します。フラグを用いる場合は、末尾のスラッシュに続けて記述します。

JavaScriptの正規表現のフラグ
フラグ 意味
g 繰り返しマッチさせる
i 大文字・小文字を区別しない
m 文字列を複数行として扱う
y(非標準) マッチの起点を変更する

.を空白文字にもマッチさせるsフラグは存在しません。代わりに[\s\S]などを使用してください。


まず、フラグを何も指定しない場合、大文字と小文字が区別されることを確認しましょう。

コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "books";
   var s = /K/ ; // 大文字になっている!!
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>


結果
含まれない。


このように、たしかに、フラグ無しでは大文字と小文字を区別していることが分かります。

つづいて、フラグを指定したコード例をみてみましょう。


コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "books";
   var s = /K/i ; // フラグが追加!! 大文字K
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>


結果
含まれてる。


上述のように i フラグを追加することにより、大文字と小文字を区別しないようになり、検索で見つけることが出来るようになりました。


ブラケット括弧 /[ ]/[編集]

正規表現において、/[ ]/ のようにスラッシュ / / の中にブラケット括弧 [ ] で囲んだ場合、下記のような機能があります。

範囲指定 /[ - ]/[編集]

ハイフン記号 - と組み合わせた場合、範囲指定が、ブラケットと正規表現で出来ます。たとえば /[a-k]/ と書けば、アルファベットの小文字のaからkまでの a,b,c,d,e,f,g,h,i,j,k までを指定したことになります。

コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "あああf";
   var s = /[a-k]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>


結果
含まれてる。


コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "あああw"; // 末尾がfではなくw
   var s = /[a-k]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>


結果
含まれない。


どれか1つの文字があればよい場合[編集]

コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "a"; 
   var s = /[ad]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>
結果
含まれてる。


解説

たとえば JavaScript や Perl の正規表現で /[ad]/ と書いた場合、これは a または d を含むかどうか、という意味です。 よって、もし検索されるガワの文字列に b や c が含まれていても、マッチしないです。

コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "c"; 
   var s = /[ad]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>
結果
含まれない。


コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "d"; 
   var s = /[ad]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>
結果
含まれてる。


さがしたい文字列が3文字以上であっても、構いません。また、特にアルファベット順に書く必要は無いです。

コード例
<meta charset="Shift-JIS">
<script>

  var aaa = "fq"; 
   var s = /[afdy]/ ; 
  if( s.test(aaa) ) {
      document.write("含まれてる。" + "<br>" );
  }
  else {
      document.write("含まれない。" + "<br>" );
  }

</script>
結果
含まれてる。
解説

/[afdy]/ とあるので、aかfかdかyのどれかがあればよく、そして文字列「fq」にfが含まれているので、検索にマッチします。

パターンマッチ[編集]

JavaScriptで正規表現によるパターンマッチを行う方法はいくつかあります。単に文字列の中にパターンが含まれているかどうかのみを知りたい場合は、testメソッドを使用します。

var matches = /regexp/.test('string');

文字列の中から特定のパターンに一致する部分を抽出したい場合は、Stringオブジェクトのmatchメソッドを使います。

var matches = 'string'.match(/regexp/);

そのほかにも、RegExpオブジェクトのexecメソッドが存在します。大まかに言って、マッチした結果の詳細を取り出したい場合はexecメソッドを使用するという使い分けができます。

Stringオブジェクトには、文字列の中のパターンに一致する部分を別の文字列で置換する、replaceメソッドや、パターンに一致する位置を取得する、searchメソッドがあります。

RegExp[編集]

JavaScriptの正規表現オブジェクトの実体はRegExpオブジェクトのインスタンスです。RegExpオブジェクトのコンストラクタは第一引数に正規表現、第二引数にフラグを受け取ります。 第一引数の正規表現に\d\sなどのメタ文字が含まれる場合は、バックスラッシュが文字列リテラルのエスケープ文字として扱われないように、\\とエスケープする必要があります。

var regexp = new RegExp('\\d+', 'gim');

PerlのquotemetaRubyRegExp.quoteのように、()や[]など正規表現のメタ文字と解釈される可能性のある文字をエスケープして返す関数は、Stringオブジェクトのreplaceメソッドを使用して簡単に作成することができます。

function quote(str){
    return str.replace(/\W/g, function($0){
        return '\\' + $0;
    });
};

alert( quote('()') ); // 「\(\)」と表示

プロパティ[編集]

RegExpオブジェクトのプロトタイプです。
このページ「JavaScript/正規表現」は、まだ書きかけです。加筆・訂正など、協力いただける皆様の編集を心からお待ちしております。また、ご意見などがありましたら、お気軽にトークページへどうぞ。