Выражение Regex слишком жадное - PullRequest
0 голосов
/ 14 июня 2010

Я пишу регулярное выражение для сопоставления данных из файла данных звуковых дорожек IMDb.Мои регулярные выражения в основном работают, хотя в некоторых местах они впрыскивают слишком много текста в названные группы.Возьмем, к примеру, следующее регулярное выражение:

"^  Performed by '?(?<performer>.*)('? \(qv\))?$"

Группа исполнителей включает в себя строку ' (qv), а также имя исполнителя.К сожалению, поскольку записи не имеют постоянного формата, имена некоторых исполнителей заключены в одинарные кавычки, а другие нет.Это означает, что они являются необязательными, поскольку это касается регулярных выражений.

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

Я могу улучшить результаты, изменив группу исполнителей так, чтобы она соответствовала небольшому диапазону символов, но это снижает мои шансы правильно разобрать имя.Кроме того, если бы я просто исключил символ апостроф, я бы не смог разобрать, например, имена групп, содержащие апострофы, такие как группа одиноких друзей Элии, которая исполнила Run For Your Life , показанную в Обитель зла: Апокалипсис .

Обновление: Вот пример строки ввода, которой регулярное выражение должно соответствовать, в соответствии с запросом.Также представлены другие форматы, которые не поддерживаются моим существующим регулярным выражением.

"  Performed by 'Carmen Silvera' (qv)"

1 Ответ

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

Вот решение вашей непосредственной проблемы, хотя я просмотрел файл данных звуковых дорожек IMDB, и это не решит все проблемы там.

var exp = new Regex(@"^  Performed by '?(?<performer>.*?)('? \(qv\))?$");

В основном вам нужно указать не жадный поискна соответствие исполнителя.

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

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