RegEx для сопоставления повторения [01] с использованием групп захвата - PullRequest
0 голосов
/ 11 мая 2019

У меня есть строка значений переменной длины (фактически, биты: 1 и 0, кратные 32).Например:

010011011001110111100111011010001001100011101100100011100010100011110010100011001111111101101001

Каждый из 32-битных блоков содержит внутреннюю структуру: первые 8 битов и следующие 24 бита принадлежат друг другу.

Мне нравится

  • Выбрать каждый 32-битный блок и
  • внутреннюю структуру каждого блока

в одном регулярном выражении.

Мой подход

^(([01]{8})([01]{24})){0,}$

не сработал, поскольку он соответствует только последнему блоку.

Возможно ли такое регулярное выражение?Что искать?Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

В Java вы можете получить по одному совпадению за раз.

Код

// \G matches only exactly where the previous `find()` left off
// (?:^|\G) matches either at start of line or where previous `find()` left off
Pattern p = Pattern.compile("(?:^|\G)([01]{8})([01]{24})");
// inputString should not contain e.g. newline characters
Matcher m = p.matcher(inputString);
boolean lastMatchEnd = 0;
while (m.find()) {
    String firstPart = m.group(1);
    String secondPart = m.group(2);
    // ...
    // remember how far we got
    lastMatchEnd = m.end();
}
if (lastMatchEnd != inputString.length()) {
  // if we get here, there were garbage in the line that did not match
}
2 голосов
/ 11 мая 2019

Я немного изменил его, используя этот инструмент :

(([0-1]{8})([0-1]{24}))

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

u

Описательный график RegEx

Эта ссылка поможет вам визуализировать ваши выражения:

enter image description here

Демонстрация тестирования JavaScript

const regex = /(([0-1]{8})([0-1]{24}))/gm;
const str = `010011011001110111100111011010001001100011101100100011100010100011110010100011001111111101101001
`;
const subst = `Group #1: $1\nGroup #2: $2\nGroup #3: $3\n`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

Тест производительности

Этот фрагмент возвращает время выполнения цикла for в миллион раз.

const repeat = 1000000;
const start = Date.now();

for (var i = repeat; i >= 0; i--) {
	const regex = /(([0-1]{8})([0-1]{24}))/gm;
	const str = `010011011001110111100111011010001001100011101100100011100010100011110010100011001111111101101001`;
	const subst = `\nGroup #1: $1\nGroup #2: $2\nGroup #3: $3`;

	var match = str.replace(regex, subst);
}

const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ??? ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ? ");
...