Комплексная задача регулярного выражения - PullRequest
1 голос
/ 06 июля 2010

Мне нужно разобрать writeln("test"); из строки.
Я использовал (?<type>writeln)\((?<args>[^\)]*)\); в качестве регулярного выражения, но это не идеально, если вы попытаетесь разобрать writeln("heloo :)"); или что-то подобное, регулярное выражение не будет анализировать его (из-за ')' в кавычках). Есть ли способ зарегистрировать это, поскольку ')' находится в кавычках, регулярное выражение должно игнорировать его и искать следующий ')'?

Спасибо
Макс

Ответы [ 3 ]

2 голосов
/ 06 июля 2010

Почему бы не написать небольшой парсер для этого? Просто просматривайте символы и используйте простой конечный автомат для разбора.

Такого рода задачи трудно решить в регулярных выражениях, поскольку проблема (грамматика) не является регулярной. Посмотрите на парсинг HTML с регулярным выражением в SO;)

НО: Если вы в определенной степени управляете своим вводом, то вам, возможно, удастся избежать неприятностей с регулярными выражениями. Смотрите другие ответы здесь для "достаточно хороших" способов сделать это.

Это в основном сводится к:

  1. решите, насколько глубоко заходит кроличья нора (какую «рекурсию» вы хотите смоделировать)
  2. создать альтернативное (ветвление) регулярное выражение для каждой такой рекурсии
  3. загляните в следующий раз, когда вам понадобится изменить регулярное выражение

Я делаю это все время. И я ненавижу себя за это!

1 голос
/ 06 июля 2010

Следующие шаблоны будут соответствовать шаблонам типа writeln("hello :) \"world\"!");

string regex = "(?<type>writeln)\\(\"(?<args>(\\\\\"|[^\"])*)\"\\);";

Я предполагаю, что это только для отдельных аргументов.

1 голос
/ 06 июля 2010

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

Как говорится, попробуйте:

(?<type>writeln)\((?<args>("[^"]*"|))\);

Это не идеально, но ничего не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...