正規表現とは、文字を検索、置換するためのルールのこと。
表現方法の仕方:
文字列オブジェクト . replace( / 検索文字列 / フラグ , 置換する文字列 )
悩んだところ
- var a = “mn abcd aBCd aXYd mn”;
- var res = a.match(/a(.)(.)d/i);
- if (res !== null) {
- document.write(“入力文字列 : ” + res.input + “<br>”);
- document.write(“一致位置 : ” + res.index + “<br>”);
- document.write(“結果格納数 : ” + res.length + “<br>”);
- // 0は一致した文字列全体、1以降は丸括弧の中身
- for (var i = 0; i < res.length; i ++) {
- document.write(“結果” + i + ” : ” + res[i] + “<br>”);
- }
- }
【結果】
入力文字列 : mn abcd aBCd aXYd mn 一致位置 : 3 結果格納数 : 3 結果0 : abcd 結果1 : b 結果2 : c
まず、matchメソッドについて
書き方 | 意味 |
---|---|
文字列.match(正規表現) | 文字列の『一致した部分の情報』、もしくは『null』を返す |
文字列.search(正規表現) | 文字列の『一致した位置』、もしくは『-1』を返す |
解説
正規表現の検索方法になる。
1、は文字列が変数aに入っている。
2、はaがオブジェクト、matchがメソッドで()内が正規表現となる。
中身は、フラグがiなので、大文字、小文字区別しない
フラグ | 説明 |
---|---|
g | 全部を置換する (gがなければ最初の1つのみを置換) |
i | 英語の大文字、小文字を区別せずに扱う (iがなければ区別する) |
m | 文頭『^』や文末『$』の一致処理を、各行の行頭や行末にも適用する (mがなければ、文頭『^』や文末『$』は文字列の先頭と末尾のみに適 |
3、if (res !== null){~}では、検索した結果一致するものがなければnullを表示する。
4~6、res.input , res.index , res.lengthについては
res.input | 入力文字列 |
res.index | 一致の位置 |
res.length | 結果格納数 |
res[0] res[1] res[2] : | 一致の全体 最初の丸括弧の中身 次の丸括弧の中身 : |
である。
4~6についてわからなかったところ。
順番的にまず、 var a = “mn abcd aBCd aXYd mn”;の文字列がある。
次に、var res = a.match(/a(.)(.)d/i);より、
変数resにmatchメソッドで変数a(文字列が格納されている)を検索した結果が入る。
matchメソッドの()の中は、
エスケープ(”/”はエスケープという)の間には検索文字列が入る。
その中身はというと、 (/a(.)(.)d/i) より、aとdの2つに挟まれている、丸括弧2つは、任意の1文字が入る 。
この意味は、最初のaと最後のdに挟まれた文字列を探し出す。→a●●d(●は任意の1文字)
つまり、変数aには”mn abcd aBCd aXYd mn”の文字列が入っているので、一致するのはmnスペースの次の「abcd」になる。
次に、(.)(.)の任意の位置文字にはb,cが入っているため、一致する値はb,cとなる。
この結果をresに代入するのだが、matchメソッドは配列で返すため[abcd , b , c]となる!!
※4~6について…matchメソッドの返り値は、色々な設定(プロパティ)を持っているので、.input , .index , .length 等 その情報を引き出すのに変数resに入っている値( var res = a.match(/a(.)(.)d/i); のこと)のinput情報、index情報、length情報を取り出し、document.writeで書き出しているだけのこと!!←ここ大事!!!!!
4、 document.write(“入力文字列 : ” + res.input + “<br>”);
一番最初のres.input(入力文字列を呼び出すプロパティ)は、resの中身は配列の[abcd,b,c]が格納されている。が、入力文字列なので “mn abcd aBCd aXYd mn”; が表示される。
5、document.write(“一致位置 : ” + res.index + “<br>”);
a=”mn abcd aBC aXYd mn”;
—–0123456789…←左から何番目が一致した位置なのか(indexの値:3 aが左から3番目スペースも数に入れる!!)
6、document.write(“結果格納数 : ” + res.length + “<br>”);
一致したらフラグにgがないので (var res = a.match(/a(.)(.)d/i);←この部分) 、一致した部分の最初の1つのみの情報を取り出す。→(この時点で、abcdにだけフォーカスする)
また、
matchの戻り値は配列であることから…
document.write(“結果格納数 : ” + res.length + “<br>”);
のres.lengthより、変数resには先ほどの[abcd,c,d]が格納されているので、結果は3になる。
※matchの戻り値は配列!! 通常の配列にinputm,indexというプロパティがついている。
もりけん塾
もりけん先生ブログ
コメント