トッカンソフトウェア

JavaScript 正規表現

今回は正規表現をやります。


検索

				
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScriptのテストページ</title>
</head>
<body>
正規表現テスト
</body>
<script type="text/javascript">

	console.log("指定文字を抜き出します");
	console.log("abcde".match(/bc/));
	console.log(/bc/.exec("abcde"));
	// ↑両方とも["bc", index: 1, input: "abcde"]が出力されます

	console.log("指定文字が含まれるか判断します");
	var moto = "abcde";
	var search = "bc";
	var reg = new RegExp(search);
	console.log(reg.test(moto));
	console.log(/bc/.test(moto));
	// ↑両方ともtrueが出力されます

	console.log("実行オプションにiを付けると大文字、小文字を区別しません");
	search = "BC";
	reg = new RegExp(search,"i");
	console.log(reg.test(moto));
	console.log(/BC/i.test(moto));
	// ↑両方ともtrueが出力されます

	console.log("実行オプションにgを付けるとすべて抜き出します");
	moto = "abcdeabcde";
	search = "bc";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/bc/g));
	// ↑両方とも["bc", "bc"]が出力されます

	console.log("正規表現に^を付けると指定した文字が行の先頭にあるか調べます");
	console.log("(オプションにmを付けると文中の改行も検知します)");
	moto = "abcde\r\nabcde";
	search = "^ab";
	reg = new RegExp(search,"mg");
	console.log(moto.match(reg));
	console.log(moto.match(/^ab/mg));
	// ↑両方とも["ab","ab"]が出力されます


	console.log("正規表現に$を付けると指定した文字が行の後尾にあるか調べます");
	console.log("(オプションにmを付けると文中の改行も検知します)");
	moto = "abcde\r\nabcde";
	search = "de$";
	reg = new RegExp(search,"mg");
	console.log(moto.match(reg));
	console.log(moto.match(/de$/mg));
	// ↑両方とも["de","de"]が出力されます

	console.log("正規表現で*を指定すると直前文字の0回以上の繰り返しを抜き出します");
	moto = "abcaabbccaaabbbccc";
	search = "aa*";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/aa*/g));
	// ↑両方とも["a", "aa", "aaa"]が出力されます

	console.log("正規表現で?を指定すると直前文字の0または1回の繰り返すを抜き出します");
	moto = "abcaabbccaaabbbccc";
	search = "aaa?";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/aaa?/g));
	// ↑両方とも["aa", "aaa"]が出力されます

	console.log("正規表現で+を指定すると直前文字の1回以上の繰り返しを抜き出します");
	moto = "abcaabbccaaabbbccc";
	search = "a+";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/a+/g));
	// ↑両方とも["a", "aa", "aaa"]が出力されます

	console.log("正規表現で.を指定するとなにか一文字の代わりになります");
	moto = "abcaabbccaaabbbccc";
	search = "a..";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/a../g));
	// ↑両方とも["abc", "aab", "aaa"]が出力されます

	console.log("正規表現で.+?のように+?の組み合わせをすると一番短い検索結果が抜き出されます");
	moto = "abcaabbccaaabbbccc";
	search = ".+?c";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/.+?c/g));
	// ↑両方とも["abc", "aabbc", "caaabbbc", "cc"]が出力されます

	console.log("正規表現で[]で囲むと[]内のどれかが一致で抜き出されます。[0-9a-zA-Z]のように何から何のような指定も出来ます");
	moto = "abcaabbccaaabbbccc";
	search = "[ab]+";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/[ab]+/g));
	// ↑両方とも["abc", "aabbc", "caaabbbc", "cc"]が出力されます

	console.log("正規表現で[]で^を付けるとすべて不一致で抜き出されます");
	moto = "abcaabbccaaabbbccc";
	search = "[^ab]+";
	reg = new RegExp(search,"g");
	console.log(moto.match(reg));
	console.log(moto.match(/[^ab]+/g));
	// ↑両方とも["c", "cc", "ccc"]が出力されます

	console.log("正規表現で()で囲むと()内を個別で抜き出すことができます。");
	console.log("これを行う場合、実行オプションのgを外す必要があります。");
	moto = "abcaabbccaaabbbccc";
	search = "(ab+).+?(bc+)";
	reg = new RegExp(search);
	console.log(moto.match(reg));
	console.log(moto.match(/(ab+).+?(bc+)/));
	// ↑両方とも["abcaabbcc", "ab", "bcc"]が出力されます

</script>
</html>


			
正規表現は /~/で定義したり、new RegExp(~)で定義します。使い方は上記のサンプルのように書きます。

文字 説明
\s スペース
\S スペース以外
\d 数値([0-9])
\D ↑以外([^0-9])
\t タブ文字
\w 英数字とアンダーバー([0-9a-zA-Z_])
\W ↑以外([^0-9a-zA-Z_])
\n 改行文字(CR)
\r 改行文字(LF)


記号を検索したい場合、正規表現で決められている記号とかぶる場合があります。記号の頭に\を付けると正規表現の記号として使われません。
例:\.、\\、\+ など

(カッコ)内のデータ取得

(カッコ)内で指定したデータを取得するサンプルです。matchメソッドは検索結果を配列で戻すので、その配列から指定データを取得します。
配列の0番目にはマッチした全体がセットされ、1番目からカッコに一致するデータがセットされます。
				
<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>JavaScriptのテストページ</title>
</head>

<body>
	正規表現テスト
	<div id="id1">Hello</div>
</body>
<script type="text/javascript">
	var moto = "abcaabbccaaabbbccc";
	var search = "(ab+).+?(bc+)";
	var reg = new RegExp(search);
	var ary = moto.match(/(ab+).+?(bc+)/);
	var ary2 = moto.match(reg);
	var html = "";
	html += "<table>";
	// aryをary2に変更しても同じ結果になります
	for (var idx in ary) {
		html += "<tr><td>" + idx + "</td><td>" + ary[idx] + "</td></tr>";
	}
	html += "</table>";
	document.getElementById("id1").innerHTML = html;
</script>

</html>


			

置換

				
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JavaScriptのテストページ</title>
</head>
<body>
正規表現テスト
</body>
<script type="text/javascript">

	console.log("置換を行う場合、replace関数で正規表現を指定できます。");
	var moto = "abc123";
	var search = "b.";
	var reg = new RegExp(search,"g");
	console.log(moto.replace(reg,"A"));
	console.log(moto.replace(/b./g,"A"));
	// ↑両方とも["aA123"]が出力されます

	console.log("()を使うと抜き出すことができ、置換後の文字列に$+番号指定で含めることができます");
	moto = "abcde12345";
	search = ".*?(b.).*?([1-5]+)";
	reg = new RegExp(search,"g");
	console.log(moto.replace(reg,"--$1--$2--"));
	console.log(moto.replace(/.*?(b.).*?([1-5]+)/g,"--$1--$2--"));
	// ↑両方とも["--bc--12345--"]が出力されます

</script>
</html>

			

replace関数で置換元を正規表現で指定することができます。

置換元に()を指定すると、指定文字を抜き出すことができ、置換後の文字列に$番号指定で含めるとが出来ます。



ページのトップへ戻る