JavaScript 正規表現
引数に正規表現(Regular Expression)をとるメソッドのためのオブジェクトです。.execメソッドの引数で検索文字列を設定できるので、.RegExpオブジェクトだけで正規表現検索が実行できます。ややこしい正規表現による記述を再利用する場合には、このオブジェクトを使うとスッキリすることもあります。更に正規表現パターンマッチングを実施したときの便利な機能も提供してくれます。
正規表現オブジェクトの生成 RegExp
正規表現オブジェクト(入れ物・モノ)を生成するには、以下のように定義します。
- regexData1 = new RegExp() //空の正規表現オブジェクト
- regexData2 = new RegExp("Regular Expression")//正規表現文字列 /Regular Expression/と同じ
- regexData3 = new RegExp(”Regular Expression”, "g") //正規表現検索オプション初期化 /Regular Expression/g と同じ
上記のように生成した正規表現オブジェクトを文字列オブジェクトの正規表現を引数とするメソッド.matchや.replaceや.searchの引数に指定することができます。
サンプルプログラムは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp</TITLE>
</HEAD>
<BODY>
JavaScript RegExp<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp() //空の正規表現オブジェクト
regexData2 = new RegExp("Regular Expression")//正規表現文字列 /Regular Expression/と同じ
regexData3 = new RegExp("Regular Expression", "g") //正規表現検索オプション初期化 /Regular Expression/g と同じ
strData = new String("正規表現文字列検索(Regular Expression)(Regular Expression2)");
document.write("■RegExp<br />");
document.write("正規表現文字列検索 = ", strData.match(regexData2), "<br />");
document.write("正規表現文字列検索 = ", strData.match(regexData3), "<br />");
document.write("パターンマッチ = ", $1, $2,"<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索の検索文字列設定・参照 RegExp.input , RegExp.$_
正規表現検索を実行する都度、書き換わるRegExpオブジェクト自体が保有する静的なプロパティです。つまり、オブジェクトから生成した変数オブジェクト毎には存在しないものです。したがって利用する場合は参照のみで、以下のようにして参照します。
参照の場合には
- strRegExpData1 = RegExp.input
のようにします。もしくは
- strRegExpData2 = RegExp.$_
設定するには
- RegExp.input = "文字列検索対象(Regular Expression)"
のようにします。もしくは
- RegExp.$_ = "文字列検索対象(Regular Expression)"
でも、検索対象を設定できます。ただし、正規表現検索の結果で一致するものがなかった場合は、RegExp.input、RegExp.$_、exec()の引数に与えた文字列が反映されません。
サンプルプログラムは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp input</TITLE>
</HEAD>
<BODY>
JavaScript RegExp input<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression")//正規表現文字列 /Regular Expression/と同じ
regexData2 = new RegExp("Regular Expression2")//正規表現文字列 /Regular Expression2/と同じ
document.write("■RegExp input<br />");
regexData2.exec("正規表現文字列検索(Regular Expression2)");
document.write("正規表現文字列検索input = ", RegExp.input, "<br />");
regexData1.exec("$_正規表現文字列検索(RegularExpression)");
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");//マッチしてないから入れ替わらない。
RegExp.input = "$_正規表現文字列検索(RegularExpression)"
regexData1.exec();
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現文字列設定 .compile
オブジェクト変数の初期化時にも設定できる正規表現文字列を再設定することができるメソッドです。引数には正規表現を設定できます。
- regexData.compile("regular")
引数は
- 第一引数:正規表現文字列
だけです。
サンプルプログラムは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp compile</TITLE>
</HEAD>
<BODY>
JavaScript RegExp compile<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2")//正規表現文字列 /Regular Expression2/と同じ
document.write("■RegExp compile<br />");
regexData1.exec("正規表現文字列検索(Regular Expression2)");
document.write("正規表現文字列検索input = ", RegExp.input, "<br />");
regexData1.compile("Regular");
regexData1.exec("$_正規表現文字列検索(RegularExpression)");
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現文字列参照 .source
オブジェクト変数の初期化時にも設定できる正規表現文字列を参照できるメソッドです。
- regexData.source
引数は設定できません。
サンプルプログラムは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp compile</TITLE>
</HEAD>
<BODY>
JavaScript RegExp compile<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2")//正規表現文字列 /Regular Expression2/と同じ
document.write("■RegExp compile<br />");
regexData1.exec("正規表現文字列検索(Regular Expression2)");
document.write("正規表現文字列検索input = ", RegExp.input, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
regexData1.compile("Regular");
regexData1.exec("$_正規表現文字列検索(RegularExpression)");
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索実行 .exec
このメソッドはこれまでのサンプルですでに使っていました。RegExp.inputやRegExp.$_といった検索対象文字列を設定する静的プロパティを利用していた場合に、このexecメソッドに引数無しで呼び出したときには、初期化時や.compileに与えられた正規表現にしたがって正規表現検索処理が実行されます。またRegExp.inputやRegExp.$_に設定された文字列を検索対象にしない場合には引数に検索対象文字列を設定することで、所望の検索が実行されます。
メソッドの利用方法は以下のようにします。
- strRegExp.exec()
上記のように引数なし、あるいは
- strRegExp.exec("正規表現文字列検索 Regular Expression")
- strRegExp.exec(strData)
と上記のように引数を設定することもできます。
- 第一引数:検索対象文字列
プログラムサンプルは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp exec</TITLE>
</HEAD>
<BODY>
JavaScript RegExp exec<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2") //正規表現文字列 /Regular Expression2/と同じ
document.write("■RegExp exec<br />");
RegExp.input = "正規表現文字列検索(Regular Expression2)";
regexData1.exec();
document.write("正規表現文字列検索input = ", RegExp.input, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
regexData1.compile("Regular");
regexData1.exec("$_正規表現文字列検索(RegularExpression)");
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索の一致確認 .test
このメソッドはexecによく似ていますが、その名のとおり試すことを目的としています。まずは、一致するものがあるのかないのかという判断だけするという目的です。RegExp.inputやRegExp.$_といった検索対象文字列を設定する静的プロパティを利用していた場合に、このtestメソッドに引数無しで呼び出したときには、初期化時や.compileに与えられた正規表現にしたがって正規表現検索処理が実行されます。またRegExp.inputやRegExp.$_に設定された文字列を検索対象にしない場合には引数に検索対象文字列を設定することで、所望の検索のテストが実施されます。
メソッドの利用方法は以下のようにします。
- bRegexResult = strRegExp.test()
上記のように引数なし、あるいは
- bRegexResult = strRegExp.test("正規表現文字列検索 Regular Expression")
- bRegexResult = strRegExp.test(strData)
と上記のように引数を設定することもできます。
- 第一引数:検索対象文字列
プログラムサンプルは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp exec</TITLE>
</HEAD>
<BODY>
JavaScript RegExp exec<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2") //正規表現文字列 /Regular Expression2/と同じ
document.write("■RegExp exec<br />");
RegExp.input = "正規表現文字列検索(Regular Expression2)";
document.write("検索試験test = ", regexData1.test(), "<br />");
document.write("検索実行exec = ", regexData1.exec(), "<br />");
document.write("正規表現文字列検索input = ", RegExp.input, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
regexData1.compile("Regular");
document.write("検索試験test = ", regexData1.test("$_正規表現文字列検索(RegularExpression)"), "<br />");
document.write("検索実行exec = ", regexData1.exec("$_正規表現文字列検索(RegularExpression)"), "<br />");
document.write("正規表現文字列検索$_ = ", RegExp.$_, "<br />");
document.write("正規表現文字列検索source = ", regexData1.source, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索の検索条件確認 .global(グローバルマッチング)
RegExgオブジェクトを引き継いだ変数が検索オプションのglobalマッチングを有効にしている状態であるかを確認するメソッドです。
以下のようにして利用します。
- bRegexGlobal = strRegExp.global
プログラムサンプルは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp global</TITLE>
</HEAD>
<BODY>
JavaScript RegExp global<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2","g"); //正規表現文字列 /Regular Expression2/gと同じ
regexData2 = /Regular Expression/g; //正規表現文字列 /Regular Expression/gと同じ
document.write("■RegExp global<br />");
document.write("正規表現文字列検索オプション regexData1.global = ", regexData1, "<br />");
document.write("正規表現文字列検索オプション regexData2.global = ", regexData2, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索の検索条件確認 .ignoreCase(大文字小文字区別無視)
RegExgオブジェクトを引き継いだ変数が検索オプションのignoreCaseマッチングを有効にしている状態であるかを確認するメソッドです。
以下のようにして利用します。
- bRegexIgnoreCase = strRegExp.ignoreCase
プログラムサンプルは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp ignoreCase</TITLE>
</HEAD>
<BODY>
JavaScript RegExp ignoreCase<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular Expression2","i"); //正規表現文字列 /Regular Expression2/gと同じ
regexData2 = /Regular Expression/i; //正規表現文字列 /Regular Expression/gと同じ
document.write("■RegExp ignoreCase<br />");
document.write("正規表現文字列検索オプション regexData1.ignoreCase = ", regexData1.ignoreCase, "<br />");
document.write("正規表現文字列検索オプション regexData2.ignoreCase = ", regexData2.ignoreCase, "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
正規表現検索の検索条件指定 RegExp.multiline(改行コード無視) , RegExp.$*
検索対象の文字列の中の改行コードを無視する形式で正規表現検索をかけるか?かけないか?を指定する静的なRegExpオブジェクトのプロパティ値です。このプロパティ値がtrueなら改行コードを含めて検索し、falseなら改行コードを無視することになります。
以下のようにして利用します。
- RegExp.multiline = false
あるいは
- RegExp.$* = false
として利用します。
プログラムサンプルは以下のとおりです。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp multiline</TITLE>
</HEAD>
<BODY>
JavaScript RegExp multiline<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("Regular\nExpression"); //正規表現文字列 /Regular Expression2/gと同じ
regexData2 = /Regular Expression/i; //正規表現文字列 /Regular Expression/gと同じ
document.write("■RegExp multiline<br />");
RegExp.input = "Regular\nExpression2";
RegExp.multiline = true;
document.write("正規表現文字列検索 RegExp.multiline(true) = ", regexData1.exec(), "<br />");
RegExp.multiline = false;
document.write("正規表現文字列検索 RegExp.multiline(false) = ", regexData1.exec(), "<br />");
-->
</SCRIPT>
</BODY>
</HTML>
と説明したとおりになるかなって思ったんですけど、ならないね。もうちょっと研究してみます。orz何が原因なんだろ...鬱
で、いろいろやってみたんですけど、RegExp.inputによる検索対象文字列設定とRegExpオブジェクト変数を使ってのxx.exec()の引数無しによるRegExp.inputを検索する方法ではmultilineのオプションが動作しないみたいで、検索一致すらしません。RegExp.inputの文字列中では改行による行頭という概念が存在していないのかもしれません。謎です。謎。謎?んなわけないっす。自分がわかっていないだけです。わかっている人はいるのかもしれません。わたくしめにはこれ以上は調べられませんので、真相究明にはかなり時間がかかると思います。一方通行な記事ですので、誰からも助言を得ることさえありません。おそらく…。この先、わたくしめにそのことを教えてくれる、そんな親切な人はあらわれないでしょう。
更に実験したサンプルは以下になります。
<HTML>
<HEAD>
<TITLE>JavaScript RegExp multiline</TITLE>
</HEAD>
<BODY>
JavaScript RegExp multiline<br />
<SCRIPT Language="JavaScript">
<!--
regexData1 = new RegExp("^Expression","m"); //正規表現文字列 /Regular Expression2/gと同じ
regexData2 = /^Expression/m; //正規表現文字列 /Regular Expression/gと同じ
document.write("■RegExp multiline<br />");
RegExp.input = "Regular\n\nExpression2\n\n";
var ss = "Regular\n\nExpression2\n\n";
alert(RegExp.$_);
alert(ss);
RegExp.multiline = true;
document.write("正規表現文字列検索 RegExp.multiline(true) = ", RegExp.multiline,",", regexData1.exec(), "<br />");
RegExp.multiline = false;
document.write("正規表現文字列検索 RegExp.multiline(false) = ", regexData1.exec(), "<br />");
document.write("正規表現文字列検索 RegExp.multiline(true) = ", ss.replace(regexData2, "expression"), "<br />");
document.write("正規表現文字列検索 RegExp.multiline(true) = ", regexData2.exec(ss), "<br />");
alert(ss.replace(regexData2, "expression"));
-->
</SCRIPT>
</BODY>
</HTML>