[解決済み】JavaScriptのString.indexOf()で正規表現ができるバージョンはありますか?
質問
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: このページのコメントで見つかったすべてのテストと私自身のテストに合格しています。もちろん、それは防弾であることを意味するものではありません。何かご意見がありましたら、どうぞ。
関連
-
[解決済み】Facebook Graph API のクエリで with=location を使用すると "Uncaught (in promise) undefined" というエラーが発生する。
-
[解決済み】別のjsファイル内でJavaScriptの関数を呼び出す
-
[解決済み] 単語を含まない行にマッチする正規表現
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] JavaScriptでNULL、未定義、空白の変数をチェックする標準的な関数はありますか?
-
[解決済み] 正規表現における非捕捉グループとは何ですか?
-
[解決済み] 有効な正規表現を検出するための正規表現はありますか?
-
[解決済み] JavaScriptで、数値が精度を失うことなく到達できる最も高い整数値は何ですか?
-
[解決済み] 正規表現における「lazy」「greedy」の意味とは?
-
[解決済み] jQueryセレクタの正規表現
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Heroku:ノードアプリで「このアプリにはデフォルトの言語が検出されませんでした」エラーがスローされる
-
[解決済み】document.getElementByIDは関数ではありません。
-
[解決済み】Angular JS Uncaught Error。[インジェクター:モジュラー]。
-
[解決済み] Uncaught Invariant Violation: 前のレンダリング中よりも多くのフックをレンダリングした
-
[解決済み】JavaScriptのinnerHTMLで要素が更新されない
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】未定義のプロパティ 'bind' を読み込めない。React.js【重複あり
-
[解決済み] エラー。モジュールhtmlが見つからない
-
[解決済み】React-Routerの子が1つしかない。
-
[解決済み】Uncaught TypeError: 未定義のプロパティ 'msie' を読み取れない - jQuery tools