概要
文字列のパターンマッチの方法として、前回の投稿は任意の文字列にマッチする方法を試しました。
正規表現を駆使すると文字列以外のマッチも多く使われます。
具体的には次の条件指定があります。
[js]
\s //空白の文字列
\b //単語の境界
\w //任意の単語(単語文字列)
\W //任意の単語文字以外の文字(境界)
^ //先頭
$ //末尾
[/js]
次のサンプルコードを書いてみます。
[js]
//先頭と末尾を指定
let test = /^abcdef$/;
let pattern_str = "abcdef";
console.log(pattern_str.match(test)); //マッチする
//先頭(単語境界の区切り文字)を指定
let test2 = /\babcdef/;
let pattern_str2 = "abcdef";
console.log(pattern_str2.match(test2)); //マッチする
//単語境界以外(\B)を指定
let test3 = /\Babcdef/;
let pattern_str3 = "abcdef";
console.log(pattern_str3.match(test3)); //マッチしない
//単語境界以外(\B)を指定
let test4 = /\B[a]bcdef/;
let pattern_str4 = "testabcdef";
console.log(pattern_str4.match(test4)); //マッチする (abcdefとしてマッチ)
//単語境界以外(\B)を指定し、任意の文字aまたはkまたはwから始まるbcdefの文字列を指定
let test6 = /\B[akw]bcdef/;
let pattern_str6 = "testkbcdef";
console.log(pattern_str6.match(test6)); //マッチする (kbcdefとしてマッチ)
//空白の文字列を指定
let test7 = /\B[akw]bcdef/;
let pattern_str7 = "test kbcdef";
console.log(pattern_str7.match(test7)); //マッチしない
//空白の文字列(\s)を指定
let test8 = /test\sabcdef/;
let pattern_str8 = "test abcdef";
console.log(pattern_str8.match(test8)); //マッチする (test abcdefとしてマッチ)
[/js]
出力結果は各console出力のコメント部分に記載した結果になります。
上記サンプルでは正規表現の一部で、詳しくは正規表現に特化した書籍やサイトで調べてプログラムを行います。
グループ化に関する記述
また、上記以外で、主にグループ化に使われる特殊文字の意味をまとめます。
[js]
| //左右どちらかに一致
(任意の文字) //複数の項目をグループ化し、1つにまとめる(一致する文字を記憶する)
(?:任意の文字) //複数の項目をグループ化し、1つにまとめる(一致する文字を記憶しない)
\N //グループ化したもののN番目の文字列に一致する
[/js]
「言明」について
さらに上記サンプルでは書いていなかった「言明」については、次のように書きます。
[js]
a(?=b) //先読み言明 aにbが続く場合のみマッチ
a(?!b) //否定先読み言明 aにbが続かない場合のみマッチ
(?<=b)a //後読み言明 bにaが続く場合のみマッチ
(?<!b)a //否定後読み言明 bにaが続かない場合のみマッチ
[/js]
上記のルールを踏まえてサンプルコードを書いてみます。
[js]
//先読み言明
let test9 = /test(?=abcdef)/;
let pattern_str9 = "testabcdef";
console.log(pattern_str9.match(test9)); //マッチする(testとしてマッチ)
//否定先読み言明
let test10 = /test(?!abcdef)/;
let pattern_str10 = "testabcdef";
console.log(pattern_str10.match(test10)); //マッチしない
//後読み言明
let test11 = /(?<=abcdef)test/;
let pattern_str11 = "abcdeftest";
console.log(pattern_str11.match(test11));
//chromeではマッチする ["test", index: 6, input: "abcdeftest", groups: undefined]
//firefoxではエラーになる (SyntaxError: invalid regexp group)
//否定後読み言明
let test12 = /(?<!abcdef)test/;
let pattern_str12 = "abcdeftest";
console.log(pattern_str12.match(test12));
//chromeではマッチしない ["test", index: 6, input: "abcdeftest", groups: undefined]
//firefoxではエラーになる (SyntaxError: invalid regexp group)
[/js]
出力結果は各consoleログの後に記載されているようになりますが、
注意が必要な点は、後読み言明の処理の場合、ブラウザの実行環境によりfirefoxの場合はエラーになります。
javascriptの実行処理がブラウザごとに完全に同一ではない点に注意する必要があります。