Javascriptの正規表現match()の結果の文字列内の(開始)文字位置を取得する方法はありますか?
ここに私が思いついたものがあります:
// 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);
}
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);
}
developer.mozilla.org String .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に至るまでテストしました。
search
オブジェクトのString
メソッドを使用できます。これは最初の一致に対してのみ機能しますが、それ以外の場合は説明どおりに機能します。例えば:
"How are you?".search(/are/);
// 4
これは最近発見したクールな機能です。コンソールでこれを試してみましたが、うまくいくようです:
var text = "border-bottom-left-radius";
var newText = text.replace(/-/g,function(match, index){
return " " + index + " ";
});
返されるもの:「境界線6底部13左18半径」
だから、これはあなたが探しているもののようです。
このメンバーfnは、Stringオブジェクト内の入力Wordの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));