回答:
exec
index
プロパティを持つオブジェクトを返します:
var match = /bar/.exec("foobar");
if (match) {
console.log("match found at " + match.index);
}
そして、複数のマッチの場合:
var re = /bar/g,
str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
console.log("match found at " + match.index);
}
re
変数として使用することとg
修飾子を追加することはどちらも重要です!そうしないと、無限ループが発生します。
undefined
。jsfiddle.net/6uwn1vof/2 は、あなたのような検索のような例ではありません。
g
フラグを削除すると機能します。以来match
、文字列の関数ではなく、正規表現は、それはのようなステートフルすることはできませんexec
ように、それはそれだけを扱いますので、exec
あなたがグローバルマッチを探していないならば、ステートフル性は問題ではないので...(つまり、インデックスプロパティを持っています) 。
これが私が思いついたものです:
// Finds starting and ending positions of quoted text
// in double or single quotes with escape char support like \" \'
var str = "this is a \"quoted\" string as you can 'read'";
var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm;
while (match = patt.exec(str)) {
console.log(match.index + ' ' + patt.lastIndex);
}
match.index + match[0].length
終了位置でも機能します。
match.index + match[0].length - 1
どうでしょう?
.slice()
やによってとられるように、排他的な終了位置を意味しました.substring()
。あなたが言うように、包括的終了は1少なくなります。(それが1だ空一致でない限り、包括的には通常、試合の内部で最後の文字のインデックスを意味することに注意してくださいする前にマッチしてあるかもしれない-1
開始時に完全に空の一致のための文字列の外に...)
String メソッドに関するdeveloper.mozilla.orgのドキュメントから.match()
:
返された配列には、解析された元の文字列を含む追加の入力プロパティがあります。さらに、文字列内の一致のゼロから始まるインデックスを表すindexプロパティがあります。
非グローバル正規表現(つまり、正規表現にg
フラグがない)を処理する場合、によって返される値に.match()
はindex
プロパティがあります...アクセスするだけです。
var index = str.match(/regex/).index;
以下は、同様に機能する例です。
var str = 'my string here';
var index = str.match(/here/).index;
alert(index); // <- 10
私はこれをIE5までずっとテストしてきました。
ここに私が最近発見したクールな機能があります、私はこれをコンソールで試しました、そしてそれはうまくいくようです:
var text = "border-bottom-left-radius";
var newText = text.replace(/-/g,function(match, index){
return " " + index + " ";
});
返されたもの:「ボーダー6ボトム13左18半径」
だから、これはあなたが探しているもののようです。
arguments
。「第二引数」ではありません。関数の引数は、「完全一致、グループ1、グループ2、...、一致のインデックス、完全一致の文字列」です
このメンバーfnは、Stringオブジェクト内の入力ワードの0ベースの位置(ある場合)の配列を返します
String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline )
{
/*besides '_word' param, others are flags (0|1)*/
var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ;
var _bound = _whole_words ? "\\b" : "" ;
var _re = new RegExp( _bound+_word+_bound, _match_pattern );
var _pos = [], _chunk, _index = 0 ;
while( true )
{
_chunk = _re.exec( this ) ;
if ( _chunk == null ) break ;
_pos.push( _chunk['index'] ) ;
_re.lastIndex = _chunk['index']+1 ;
}
return _pos ;
}
今してみてください
var _sentence = "What do doers want ? What do doers need ?" ;
var _word = "do" ;
console.log( _sentence.matching_positions( _word, 1, 0, 0 ) );
console.log( _sentence.matching_positions( _word, 1, 1, 0 ) );
正規表現を入力することもできます。
var _second = "z^2+2z-1" ;
console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) );
ここでは、線形項の位置インデックスを取得します。
var str = "The rain in SPAIN stays mainly in the plain";
function searchIndex(str, searchValue, isCaseSensitive) {
var modifiers = isCaseSensitive ? 'gi' : 'g';
var regExpValue = new RegExp(searchValue, modifiers);
var matches = [];
var startIndex = 0;
var arr = str.match(regExpValue);
[].forEach.call(arr, function(element) {
startIndex = str.indexOf(element, startIndex);
matches.push(startIndex++);
});
return matches;
}
console.log(searchIndex(str, 'ain', true));
str.indexOf
ここでは、一致によってキャプチャされたテキストの次の出現を検出しますが、これは必ずしも一致ではありません。JS regexは、先読みによるキャプチャの外側のテキストの条件をサポートします。たとえば、searchIndex("foobarfoobaz", "foo(?=baz)", true)
与えるべきでは[6]
ありません[0]
。
最近のブラウザーでは、string.matchAll()を使用してこれを実現できます。
このアプローチと比較した利点RegExp.exec()
は、@ Gumboの回答のように、正規表現がステートフルであることに依存しないことです。
let regexp = /bar/g;
let str = 'foobarfoobar';
let matches = [...str.matchAll(regexp)];
matches.forEach((match) => {
console.log("match found at " + match.index);
});
function trimRegex(str, regex){
return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}
let test = '||ab||cd||';
trimRegex(test, /[^|]/);
console.log(test); //output: ab||cd
または
function trimChar(str, trim, req){
let regex = new RegExp('[^'+trim+']');
return str.substr(str.match(regex).index).split('').reverse().join('').substr(str.match(regex).index).split('').reverse().join('');
}
let test = '||ab||cd||';
trimChar(test, '|');
console.log(test); //output: ab||cd