JavaScript 正規表現 新しいページはコチラ

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

2016年8月18日 (木) 00:00時点における最新版



個人用ツール
名前空間

変種
操作
案内
ツールボックス