web-dev-qa-db-ja.com

Javascriptで正規表現のmatch()の位置を返しますか?

Javascriptの正規表現match()の結果の文字列内の(開始)文字位置を取得する方法はありますか?

122
stagas

ここに私が思いついたものがあります:

// 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);
}
54
stagas

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);
}
185
Gumbo

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に至るまでテストしました。

12
Jimbo Jonny

searchオブジェクトのStringメソッドを使用できます。これは最初の一致に対してのみ機能しますが、それ以外の場合は説明どおりに機能します。例えば:

"How are you?".search(/are/);
// 4
5
Jimmy Cuadra

これは最近発見したクールな機能です。コンソールでこれを試してみましたが、うまくいくようです:

var text = "border-bottom-left-radius";

var newText = text.replace(/-/g,function(match, index){
    return " " + index + " ";
});

返されるもの:「境界線6底部13左18半径」

だから、これはあなたが探しているもののようです。

5
felipeab

このメンバー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 ) );

ここでは、線形項の位置インデックスを取得します。

1
Sandro Rosa
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));
1
Yaroslav