1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptのString.indexOf()で正規表現ができるバージョンはありますか?

2022-04-02 07:43:42

質問

javascript では、String.indexOf() と同等の機能で、最初のパラメータに文字列ではなく正規表現を使用し、2番目のパラメータはそのまま使用できるものはありますか?

次のようなことをしたいのですが

str.indexOf(/[abc]/ , i);

そして

str.lastIndexOf(/[abc]/ , i);

String.search() は正規表現をパラメータとして受け取りますが、第2引数を指定することはできません。

編集してください。

これは当初考えていたよりも難しいことがわかったので、提供されたすべての解決策をテストするための小さなテスト関数を書きました。これは regexIndexOf と regexLastIndexOf が String オブジェクトに追加されているものと仮定しています。

function test (str) {
    var i = str.length +2;
    while (i--) {
        if (str.indexOf('a',i) != str.regexIndexOf(/a/,i)) 
            alert (['failed regexIndexOf ' , str,i , str.indexOf('a',i) , str.regexIndexOf(/a/,i)]) ;
        if (str.lastIndexOf('a',i) != str.regexLastIndexOf(/a/,i) ) 
            alert (['failed regexLastIndexOf ' , str,i,str.lastIndexOf('a',i) , str.regexLastIndexOf(/a/,i)]) ;
    }
}

で、少なくとも1文字の正規表現については、indexOfを使った場合と同じ結果になることを確認するために、次のようなテストをしています。

//xesの中からaを探す

test('xxx');

test('axx')とします。

test('xax')です。

test('xxa');

test('axa')です。

test('xaa')とします。

test('aax');

test('aaa')とします。

解決方法は?

すでに述べたいくつかのアプローチ(indexOfは明らかにシンプルです)を組み合わせると、これらの関数がトリックを実行することになると思います。

function regexIndexOf(string, regex, startpos) {
    var indexOf = string.substring(startpos || 0).search(regex);
    return (indexOf >= 0) ? (indexOf + (startpos || 0)) : indexOf;
}

function regexLastIndexOf(string, regex, startpos) {
    regex = (regex.global) ? regex : new RegExp(regex.source, "g" + (regex.ignoreCase ? "i" : "") + (regex.multiLine ? "m" : ""));
    if(typeof (startpos) == "undefined") {
        startpos = string.length;
    } else if(startpos < 0) {
        startpos = 0;
    }
    var stringToWorkWith = string.substring(0, startpos + 1);
    var lastIndexOf = -1;
    var nextStop = 0;
    while((result = regex.exec(stringToWorkWith)) != null) {
        lastIndexOf = result.index;
        regex.lastIndex = ++nextStop;
    }
    return lastIndexOf;
}


UPDATE: Edited regexLastIndexOf() を模倣しているように見えます。 lastIndexOf() になりました。それでも失敗する場合は、どのような状況か教えてください。


UPDATE: このページのコメントで見つかったすべてのテストと私自身のテストに合格しています。もちろん、それは防弾であることを意味するものではありません。何かご意見がありましたら、どうぞ。