JS RegExp захватывает все группы и позиции для каждого матча - PullRequest
0 голосов
/ 05 марта 2019

Заявление: Я новичок в RegExp и пытаюсь узнать группы захвата в javascripts

  1. Я использую https://regex101.com/r/COYhIc/1 для тестирования
  2. см. прикрепленное изображение для столбца pos символов каждого соответствия по https://regex101.com

Цель:

  1. Я хочу напечатать все совпадения и группы на консоли (Готово)
  2. Я хочу напечатать символьную позицию каждого совпадения [см. Изображение] (осталось)

enter image description here

JSFIDDLE: https://jsfiddle.net/bababalcksheep/p28fmdk4/68/

JavaScript:

function parseQuery(query) {
  var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
  if (isRE) {
    try {
      query = new RegExp(isRE[1], isRE[2]);
    } catch (e) {}
  }
  return query;
}
var str = $('#str').val();
var regex = parseQuery($('#reg').val());
//
var result;
var match_no = 0;
var output = '';
while ((result = regex.exec(str)) !== null) {
  match_no++;
  output += `\nMatch ${match_no}\n`;
  output += `Full Match, ${ result[0]} , Pos\n`;
  for (i = 1; i < result.length; i++) {
    output += `Group ${i}, ${ result[i]} , Pos\n`;
  }
}
console.log(output);

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

В вашем поле вывода используйте index и lastIndex.exec возвращает объект со свойством индекса.

output += `Full Match, ${ result[0]} , Pos ${result.index} - ${regex.lastIndex}\n `;

Обновление для групп:

Я использовал небольшую логику для получения индексов:

var m = new RegExp(result[i]);
output += `Group ${i}, ${ result[i]}, Pos ${$('#str').val().match(m).index} - ${regex.lastIndex} \n`;

function parseQuery(query) {
  var isRE = query.match(/^\/(.*)\/([a-z]*)$/);
  if (isRE) {
    try {
      query = new RegExp(isRE[1], isRE[2]);
    } catch (e) {}
  }
  return query;
}
var str = $('#str').val();
var regex = parseQuery($('#reg').val());
//
var result;
var match_no = 0;
var output = '';
while ((result = regex.exec(str)) !== null) {
  match_no++;
  output += `\nMatch ${match_no}\n`;
  output += `Full Match, ${ result[0]} , Pos ${result.index} - ${regex.lastIndex}\n `;
  for (i = 1; i < result.length; i++) {
    var m = new RegExp(result[i]);
    output += `Group ${i}, ${ result[i]}, Pos ${$('#str').val().match(m).index} - ${regex.lastIndex} \n`;
  }
}
console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <div class="form-group">
    <label for="str">String:</label>
    <input type="text" class="form-control" id="str" value="source=100, delta=2, source=2121, delta=5">
  </div>
  <div class="form-group">
    <label for="regex">Regex:</label>
    <input type="text" class="form-control" id="reg" value="/(source=(\d+))/g">
  </div>
  <div id="result">

  </div>
</div>

FIDDLE

0 голосов
/ 05 марта 2019

Согласно документам RegExp.exec, вы можете получить его, используя свойство index.Поэтому я бы добавил эту строку в ваш фрагмент кода, чтобы получить позицию столбца для вашего полного соответствия:

`${result.index}-${result.index + result[0].length}`

Для подгрупп JS не получает индекс, поэтому можно найти обходной путь, используя indexOf:

const initialSubGroupIndex = str.indexOf(result[i], result.index);
`${initialSubGroupIndex}-${initialSubGroupIndex + result[i].length}`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...