Regex захватывает именованные группы на языке, который не поддерживает их, с помощью мета-выражения? - PullRequest
2 голосов
/ 18 июня 2010

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

/(?P<name>[a-z]*)/hhhh/(?P<surname>[a-z]*)/jjj on /foo/hhhh/bar/jjj 

даст

[("name","foo"),("surname","bar")]

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

Чтобы решить эту проблему, я решил написать мета-регулярное выражение, которое будет применяться к регулярному выражению пользователя

/(?P<name>[a-z]*)/hhhh/(?P<surname>[a-z]*)/jjj 

чтобы извлечь имена групп и заменить их ничем, чтобы получить

0 -> name
1 -> surname

и регулярное выражение становится

/([a-z]*)/hhhh/([a-z]*)/jjj 

затем примените его к строке и используйте индекс для группировки имен с совпадающими.

Два вопроса:

  1. это кажется хорошей идеей?
  2. что такое мета-регулярное выражение, которое мне нужно захватить и заменить синтаксис именованных групп

для незнакомых с именованными группами http://www.regular -expressions.info / named.html

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

Ответы [ 2 ]

4 голосов
/ 18 июня 2010

Чем более широко вы хотите применить свое решение, тем сложнее становится ваша проблема.Например, в вашем подходе вы хотите удалить именованные группы и использовать индексы (индексы?) Для соответствия.Это кажется хорошим началом, но вы должны рассмотреть несколько вещей:

  1. Если вы замените (?<name>blah) на (blah), то вам также придется заменить / name на / 1 или / 2или что-то еще.
  2. Что произойдет, если пользователь также включит неназванные группы?например: ([a-z]{3})/(?P<name>[a-z]*)/hhhh/(?P<surname>[a-z]*)/jjj on /foo/hhhh/bar/jjj.В этом случае ваша нумерация не будет работать, поскольку b / c группа 1 - это определенная пользователем неименованная группа.

См. Этот пост для некоторого вдохновения, поскольку кажется, что другие успешно пробовали то же самое (хотя вJava)

Именованные группы Regex в Java

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

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

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