Поиск регулярного выражения, соответствующего двум дочерним подстрокам в данной строке - PullRequest
0 голосов
/ 17 февраля 2019

Я пытаюсь создать регулярное выражение, которое покажет две подстроки в данной строке, и возвращаемое значение должно быть массивом, содержащим два элемента, две совпадающие строки.Я понимаю, что моя проблема тесно связана с палиндромом, который не может быть реализован как регулярное выражение, но я надеюсь, что есть регулярное выражение, которое подойдет достаточно близко, поскольку есть структура конечного размера, которую я ожидаю прочитать.

Чтобы быть очень конкретным, я забочусь только о сопоставлении двух дочерних элементов верхнего уровня, так как в первом примере любое количество вложенных скобок внутри не имеет никакого значения, независимо от того, их 1 или 99999.

Обратите внимание, что интервал просто для удобства чтения, и во входной строке не будет пробелов.Эта структура просто:

{ }{ }

и должна быть принята в виде двух строк:

{ } and { }

Содержащиеся в ней, может быть любое количество группировок фигурных скобок:

{ {} {} {} {} {} {} }{ {} }

и должно приниматься как две строки:

{ {} {} {} {} {} {} } and { {} }

Содержащиеся в любой из этих внутренних групп фигурных скобок могут быть просто бесконечными рекурсивными группировками, такими как:

{{{{ }{{ }}{ }}}}{{ }{ }{ }}

и должны бытьпринимается как две строки:

{{{{ }{{ }}{ }}}} and {{ }{ }{ }}

Я долго думал об этой проблеме сам и не мог найти правильного решения, и в сети нет никаких инструментов, которые я нашел, чтоиметь визуальный способ увидеть эти две подстроки, он всегда просто соответствует всей строке.Я также использовал некоторых создателей регулярных выражений, таких как "http://regex.inginf.units.it/" и дал ему максимальное количество строк и все возможные крайние случаи, и т. Д., Но получил точность примерно на 40%. Я надеюсь, что кто-то умнее меня по этому вопросуэто может придумать регулярное выражение, чтобы соответствовать ответам на нижних 7 примерах и любой другой возможной строке, построенной из правил выше.

Я сделал простой HTML, чтобы проверить мои строки (просто отредактируйте переменную "reg"в теге сценария, чтобы изменить регулярное выражение и просмотреть результаты с обновлением страницы:

var reg = /({({.*})*})/g;
var str1 = "{}{}";
var str2 = "{{}{}}{{}}";
var str3 = "{{{{{}{}{}{}}{{}}}}{}}{}";
var str4 = "{{{{{{{{{{{{{{{{{}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}";
var str5 = "{{}{{{{{{}{}}}}{{{{}{}}}{}}}}{}{{{}{{}}}}}{{{{{}}{{{{}{}}}}}}{{{{}}{{{{}{}}}}}}}";
var str6 = "{{}{}}{{}{{{}{}}}}";
var str7 = "{{}{}}{{{{{}}{{}}}}{{{}{}}}}";
var s1 = document.getElementById("d1").innerHTML = str1.match(reg);
var s2 = document.getElementById("d2").innerHTML = str2.match(reg);
var s3 = document.getElementById("d3").innerHTML = str3.match(reg);
var s4 = document.getElementById("d4").innerHTML = str4.match(reg);
var s5 = document.getElementById("d5").innerHTML = str5.match(reg);
var s6 = document.getElementById("d6").innerHTML = str6.match(reg);
var s7 = document.getElementById("d7").innerHTML = str7.match(reg);
<p id="d1"></p>
<p id="ans1">{},{}</p>
<p id="d2"></p>
<p id="ans2">{{}{}},{{}}</p>
<p id="d3"></p>
<p id="ans3">{{{{{}{}{}{}}{{}}}}{}},{}</p>
<p id="d4"></p>
<p id="ans4">{{{{{{{{{{{{{{{{{}}{{}}}}}{{}}}}}{{}}}}}{{}}}}}{{}}}}},{{}}</p>
<p id="d5"></p>
<p id="ans5">{{}{{{{{{}{}}}}{{{{}{}}}{}}}}{}{{{}{{}}}}},{{{{{}}{{{{}{}}}}}}{{{{}}{{{{}{}}}}}}}</p>
<p id="d6"></p>
<p id="ans6">{{}{}},{{}{{{}{}}}}</p>
<p id="d7"></p>
<p id="ans7">{{}{}},{{{{{}}{{}}}}{{{}{}}}}</p>

1 Ответ

0 голосов
/ 17 февраля 2019

Regex не подходит для этой задачи (по крайней мере, JS не подходит).Все, что включает в себя структуры, которые могут быть произвольно вложены, не подходит для сопоставления с регулярным выражением.Вот почему они говорят , что вы не должны использовать регулярные выражения для анализа HTML или JSON.Посмотрите этот ответ для получения дополнительной информации.

Строка, которую вы здесь видите, довольно проста для анализа без использования регулярных выражений.Используя регулярные выражения, вы как бы усложняете себе жизнь.

Вот как разобрать эту строку (при условии, что скобки всегда сбалансированы):

  • перебрать строку
  • если вы встретите открытую фигурную скобку, добавьте ее к переменной счетчика
  • , если вы встретите закрывающую фигурную скобку, минус один
  • Когда переменная счетчика впервые достигает 0, это конецпервой подстроки, а остальная часть - вторая подстрока.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...