JavaScript indexOfメソッド

  • このエントリーをはてなブックマークに追加

indexOfメソッドを使って対象文字列からsearch文字列が検索可能である。
私は、文字列検索にはindexOfメソッドを使用している。

indexOfメソッドを使った文字列検索は次の3パターンがある。
(1)indexOfメソッドを使って対象文字列とsearch文字列が含まれるかを判定する。
(2)indexOfメソッドを使って対象文字列とsearch文字列が前方一致するかを判定する。
(3)indexOfメソッドを使って対象文字列とsearch文字列が後方一致するかを判定する。



indexOfの戻り値としては、指定された値が最初に現れたインデックスを返す。
指定された値を見つけられない場合は「-1」を返す。
前方一致する場合は「0」が返る(search文字列が最初に現れたインデックスを返す)
これによって、
(1)の場合は「-1」以外の値が返ると対象文字列にsearch文字列が含まれると言える。
(2)の場合は「0」が返ると対象文字列にsearch文字列が前方一致すると言える。
(3)の場合は対象文字列とsearch文字列をそれぞれ反転させて「0」が返ると対象文字列にsearch文字列が後方一致すると言える。

文字列を反転するにはstrrev関数を使用する。
strrev関数はLocutusが作成した物を使うことにする。


var strrev = function(string) {
    //       discuss at: https://locutus.io/php/strrev/
    //      original by: Kevin van Zonneveld (https://kvz.io)
    //      bugfixed by: Onno Marsman (https://twitter.com/onnomarsman)
    // reimplemented by: Brett Zamir (https://brett-zamir.me)
    //        example 1: strrev('Kevin van Zonneveld')
    //        returns 1: 'dlevennoZ nav niveK'
    //        example 2: strrev('a\u0301haB')
    //        returns 2: 'Baha\u0301' // combining
    //        example 3: strrev('A\uD87E\uDC04Z')
    //        returns 3: 'Z\uD87E\uDC04A' // surrogates
    //             test: 'skip-3'

    string = string + ''

    // Performance will be enhanced with the next two lines of code commented
    // out if you don't care about combining characters
    // Keep Unicode combining characters together with the character preceding
    // them and which they are modifying (as in PHP 6)
    // See https://unicode.org/reports/tr44/#Property_Table (Me+Mn)
    // We also add the low surrogate range at the beginning here so it will be
    // maintained with its preceding high surrogate

    const chars = [
        '\uDC00-\uDFFF',
        '\u0300-\u036F',
        '\u0483-\u0489',
        '\u0591-\u05BD',
        '\u05BF',
        '\u05C1',
        '\u05C2',
        '\u05C4',
        '\u05C5',
        '\u05C7',
        '\u0610-\u061A',
        '\u064B-\u065E',
        '\u0670',
        '\u06D6-\u06DC',
        '\u06DE-\u06E4',
        '\u06E7\u06E8',
        '\u06EA-\u06ED',
        '\u0711',
        '\u0730-\u074A',
        '\u07A6-\u07B0',
        '\u07EB-\u07F3',
        '\u0901-\u0903',
        '\u093C',
        '\u093E-\u094D',
        '\u0951-\u0954',
        '\u0962',
        '\u0963',
        '\u0981-\u0983',
        '\u09BC',
        '\u09BE-\u09C4',
        '\u09C7',
        '\u09C8',
        '\u09CB-\u09CD',
        '\u09D7',
        '\u09E2',
        '\u09E3',
        '\u0A01-\u0A03',
        '\u0A3C',
        '\u0A3E-\u0A42',
        '\u0A47',
        '\u0A48',
        '\u0A4B-\u0A4D',
        '\u0A51',
        '\u0A70',
        '\u0A71',
        '\u0A75',
        '\u0A81-\u0A83',
        '\u0ABC',
        '\u0ABE-\u0AC5',
        '\u0AC7-\u0AC9',
        '\u0ACB-\u0ACD',
        '\u0AE2',
        '\u0AE3',
        '\u0B01-\u0B03',
        '\u0B3C',
        '\u0B3E-\u0B44',
        '\u0B47',
        '\u0B48',
        '\u0B4B-\u0B4D',
        '\u0B56',
        '\u0B57',
        '\u0B62',
        '\u0B63',
        '\u0B82',
        '\u0BBE-\u0BC2',
        '\u0BC6-\u0BC8',
        '\u0BCA-\u0BCD',
        '\u0BD7',
        '\u0C01-\u0C03',
        '\u0C3E-\u0C44',
        '\u0C46-\u0C48',
        '\u0C4A-\u0C4D',
        '\u0C55',
        '\u0C56',
        '\u0C62',
        '\u0C63',
        '\u0C82',
        '\u0C83',
        '\u0CBC',
        '\u0CBE-\u0CC4',
        '\u0CC6-\u0CC8',
        '\u0CCA-\u0CCD',
        '\u0CD5',
        '\u0CD6',
        '\u0CE2',
        '\u0CE3',
        '\u0D02',
        '\u0D03',
        '\u0D3E-\u0D44',
        '\u0D46-\u0D48',
        '\u0D4A-\u0D4D',
        '\u0D57',
        '\u0D62',
        '\u0D63',
        '\u0D82',
        '\u0D83',
        '\u0DCA',
        '\u0DCF-\u0DD4',
        '\u0DD6',
        '\u0DD8-\u0DDF',
        '\u0DF2',
        '\u0DF3',
        '\u0E31',
        '\u0E34-\u0E3A',
        '\u0E47-\u0E4E',
        '\u0EB1',
        '\u0EB4-\u0EB9',
        '\u0EBB',
        '\u0EBC',
        '\u0EC8-\u0ECD',
        '\u0F18',
        '\u0F19',
        '\u0F35',
        '\u0F37',
        '\u0F39',
        '\u0F3E',
        '\u0F3F',
        '\u0F71-\u0F84',
        '\u0F86',
        '\u0F87',
        '\u0F90-\u0F97',
        '\u0F99-\u0FBC',
        '\u0FC6',
        '\u102B-\u103E',
        '\u1056-\u1059',
        '\u105E-\u1060',
        '\u1062-\u1064',
        '\u1067-\u106D',
        '\u1071-\u1074',
        '\u1082-\u108D',
        '\u108F',
        '\u135F',
        '\u1712-\u1714',
        '\u1732-\u1734',
        '\u1752',
        '\u1753',
        '\u1772',
        '\u1773',
        '\u17B6-\u17D3',
        '\u17DD',
        '\u180B-\u180D',
        '\u18A9',
        '\u1920-\u192B',
        '\u1930-\u193B',
        '\u19B0-\u19C0',
        '\u19C8',
        '\u19C9',
        '\u1A17-\u1A1B',
        '\u1B00-\u1B04',
        '\u1B34-\u1B44',
        '\u1B6B-\u1B73',
        '\u1B80-\u1B82',
        '\u1BA1-\u1BAA',
        '\u1C24-\u1C37',
        '\u1DC0-\u1DE6',
        '\u1DFE',
        '\u1DFF',
        '\u20D0-\u20F0',
        '\u2DE0-\u2DFF',
        '\u302A-\u302F',
        '\u3099',
        '\u309A',
        '\uA66F-\uA672',
        '\uA67C',
        '\uA67D',
        '\uA802',
        '\uA806',
        '\uA80B',
        '\uA823-\uA827',
        '\uA880',
        '\uA881',
        '\uA8B4-\uA8C4',
        '\uA926-\uA92D',
        '\uA947-\uA953',
        '\uAA29-\uAA36',
        '\uAA43',
        '\uAA4C',
        '\uAA4D',
        '\uFB1E',
        '\uFE00-\uFE0F',
        '\uFE20-\uFE26'
    ]

    const graphemeExtend = new RegExp('(.)([' + chars.join('') + ']+)', 'g')

    // Temporarily reverse
    string = string.replace(graphemeExtend, '$2$1')
    return string.split('').reverse().join('')
};

var searchWord = "au";
var buf = "taunt";

if (buf.indexOf(searchWord) !== -1) {
    //対象文字列にsearch文字列が含まれる
    console.log(buf + "の中に" + searchWord + "が含まれる。");
} else {
    //対象文字列にsearch文字列が含まれない
    console.log(buf + "の中に" + searchWord + "が含まれない。");
}

searchWord = "ta";

if (buf.indexOf(searchWord) === 0) {
    //対象文字列とsearch文字列が前方一致する
    console.log(buf + "の中に" + searchWord + "が前方一致する。");
} else {
    //対象文字列にsearch文字列が前方一致しない
    console.log(buf + "の中に" + searchWord + "が前方一致しない");
}

searchWord = "aunt";

if (strrev(buf).indexOf(strrev(searchWord)) === 0) {
    //対象文字列とsearch文字列が後方一致する
    console.log("bufの反転 strrev(buf) = " + strrev(buf));
    console.log("bufの反転 strrev(searchWord) = " + strrev(searchWord));
    console.log(buf + "の中に" + searchWord + "が後方一致する。");
} else {
    console.log("bufの反転 strrev(buf) = " + strrev(buf));
    console.log("bufの反転 strrev(searchWord) = " + strrev(searchWord));
    //対象文字列にsearch文字列が後方一致しない
    console.log(buf + "の中に" + searchWord + "が後方一致しない。");
}

/*

tauntの中にauが含まれる。
tauntの中にtaが前方一致する。
bufの反転 strrev(buf) = tnuat
bufの反転 strrev(searchWord) = tnua
tauntの中にauntが後方一致する。
*/

後方一致は次のように半角スペース1文字分を文字列に連結させた文字列同士を比較することにより、後方一致するかしないかの判定が可能だが、この半角スペース1文字分を連結させるコードは読みずらく、何をやっているかがいまいち分かりずらい気がするので、後方一致は文字列を反転させるstrrev関数を使用して0がどうかの判定にした。こちらの方が分かりやすいと自分では思う。好みかもしれない。


var searchWord = "aunt";
var buf = "taunt";
var str = buf + " ";

if (str.indexOf(searchWord + " ") !== -1) {
    console.log(buf + "の中に" + searchWord + "が後方一致する。");
}

/*

tauntの中にauntが後方一致する。

*/

参考
単語前方一致・単語後方一致・単語完全一致 String.indexOfの魔力

  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*