Вернуть позиции регулярного выражения match () в Javascript?

Есть ли способ получить (начальные) позиции символов в строке результатов соответствия регулярному выражению () в Javascript?

103 голоса | спросил stagas 19 FebruaryEurope/MoscowbFri, 19 Feb 2010 13:45:24 +0300000000pmFri, 19 Feb 2010 13:45:24 +030010 2010, 13:45:24

7 ответов


0

Вот что я придумал:

 // 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);
}
ответил stagas 19 FebruaryEurope/MoscowbFri, 19 Feb 2010 14:38:26 +0300000000pmFri, 19 Feb 2010 14:38:26 +030010 2010, 14:38:26
0

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);
}
ответил Gumbo 19 FebruaryEurope/MoscowbFri, 19 Feb 2010 13:49:16 +0300000000pmFri, 19 Feb 2010 13:49:16 +030010 2010, 13:49:16
0

От developer.mozilla.org документы по методу String .match():

  

Возвращаемый массив имеет дополнительное свойство ввода, которое содержит   исходная строка, которая была проанализирована. Кроме того, у есть индекс   свойство, которое представляет нулевой индекс совпадения в   строка .

При работе с неглобальным регулярным выражением (т. е. без флага g в вашем регулярном выражении) значение, возвращаемое .match() имеет свойство index ... все, что у вас есть сделать, это получить к нему доступ.

var index = str.match(/regex/).index;

Вот пример, показывающий, как это работает:

 var str = 'my string here';

var index = str.match(/here/).index;

alert(index); // <- 10

Я успешно проверил это вплоть до IE5.

ответил Jimbo Jonny 30 MaramWed, 30 Mar 2016 01:44:39 +03002016-03-30T01:44:39+03:0001 2016, 01:44:39
0

Вы можете использовать метод search метода String объект. Это будет работать только для первого матча, но в противном случае будет делать то, что вы описываете. Например:

"How are you?".search(/are/);
// 4
ответил Jimmy Cuadra 19 FebruaryEurope/MoscowbFri, 19 Feb 2010 13:51:37 +0300000000pmFri, 19 Feb 2010 13:51:37 +030010 2010, 13:51:37
0

Вот интересная функция, которую я недавно обнаружил, я попробовал это на консоли, и, похоже, она работает:

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

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

Что вернуло: "граница 6, нижняя 13, левый 18 радиус"

Похоже, это то, что вы ищете.

ответил felipeab 30 +03002016-10-30T16:39:25+03:00312016bEurope/MoscowSun, 30 Oct 2016 16:39:25 +0300 2016, 16:39:25
0

Этот член fn возвращает массив позиций на основе 0, если таковые имеются, входного слова внутри объекта String

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 ) );

Здесь можно получить индекс положения линейного члена.

ответил Sandro Rosa 25 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 25 Sep 2015 19:40:28 +0300 2015, 19:40:28
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));
ответил Yaroslav 27 J0000006Europe/Moscow 2016, 14:17:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132