Удаление лишних скобок в регулярном выражении - PullRequest
4 голосов
/ 07 июня 2010

Предположим, у меня есть (в регулярном выражении JavaScript)

((((A)B)C)D)

Конечно, это действительно читает

ABCD

Существует ли алгоритм для удаления ненужных скобок в такой строке?

Ответы [ 2 ]

2 голосов
/ 08 июня 2010

Эта функция удалит все группы, за которыми не стоит квантификатор, и не является поиском. Он предполагает регулярное выражение ECMAScript и что группы захвата (( ... )) не важны.

function removeUnnecessaryParenthesis(s) {
   // Tokenize the pattern
   var pieces = s.split(/(\\.|\[(?:\\.|[^\]\\])+]|\((?:\?[:!=])?|\)(?:[*?+]\??|\{\d+,?\d*}\??)?)/g);
   var stack = [];
   for (var i = 0; i < pieces.length; i++) {
      if (pieces[i].substr(0,1) == "(") {
         // Opening parenthesis
         stack.push(i);
      } else if (pieces[i].substr(0,1) == ")") {
         // Closing parenthesis
         if (stack.length == 0) {
            // Unbalanced; Just skip the next one.
            continue;
         }
         var j = stack.pop();
         if ((pieces[j] == "(" || pieces[j] == "(?:") && pieces[i] == ")") {
             // If it is a capturing group, or a non-capturing group, and is
             // not followed by a quantifier;
             // Clear both the opening and closing pieces.
             pieces[i] = "";
             pieces[j] = "";
         }
      }
   }
   return pieces.join("");
}

Примеры:

removeUnnecessaryParenthesis("((((A)B)C)D)")  --> "ABCD"
removeUnnecessaryParenthesis("((((A)?B)C)D)") --> "(A)?BCD"
removeUnnecessaryParenthesis("((((A)B)?C)D)") --> "(AB)?CD"

Он не пытается определить, содержит ли скобка только один токен ((A)?). Для этого потребуется более длинный шаблон токенизации.

0 голосов
/ 08 июня 2010

1) Используйте синтаксический анализатор, который понимает скобки

2) Используйте рекурсивное регулярное выражение Perl, которое может совпадать с круглыми скобками (в данном случае не рекомендуется). Я не думаю, что Boost регулярное выражение поддерживает необходимый тип рекурсии.

3) Возможно, они нужны?Оставь их.

...