Ehsan Sajjad Ответов: 3

Регулярное выражение получает последнее совпадающее событие из совпадений


Привет,

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

C0230: R1410: S. 05.02.01.04: главная страна - пожизненные обязательства: брутто: топ - 5 стран (по сумме написанных валовых премий) - обязательства, не связанные с жизнью: Топ-5 стран (по сумме выписанных валовых премий) - пожизненные обязательства: США

и мне нужно узнать название страны там только в том случае, если C0230, R1410 и S. 05.02 присутствуют в строке, иначе я не буду соответствовать названию страны или не буду его использовать.

Что я уже пробовал:

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

(?<=(?i)((C)0230).*((R)1410).*((S)\.05.02).*(life obligations)).[^\d]*\b


Может ли кто-нибудь указать мне, как это можно сделать?

3 Ответов

Рейтинг:
21

OriginalGriff

Попробовать это:

(?<=C0230.+?R1410.+S\.05\.02)(.+:){5}(?<Country>.+)$
Затем используйте группу "страна", чтобы получить интересующие вас данные.


Ehsan Sajjad

проблема в том, что название страны может быть любым

OriginalGriff

Да - и он соответствует любому.

Или ты хочешь сказать, что это может быть где угодно?

Ehsan Sajjad

неважно, это работает для примера, опубликованного в вопросе, но на самом деле я искал что-то более общее, например, ваше регулярное выражение ищет 5 вхождений : sign, и это не будет точно 5 в каждом случае, может быть больше или меньше, но страна будет в конце.

OriginalGriff

Затем либо измените {5} на более простое "+" или "*" и попробуйте, либо лучше используйте регулярное выражение для определения строк, которые вам нужно обработать, и используйте LastIndexOf для получения окончательных данных. Чем сложнее вы создаете регулярное выражение, тем труднее его понять и изменить при изменении данных, поэтому "комбинированный" подход может создать гораздо лучший и более надежный код в долгосрочной перспективе.

Рейтинг:
2

Patrice T

Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
RegExr: Learn, Build, & Test RegEx[^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение:
Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]


Рейтинг:
18

Thomas Daniels

Если вы поставите знак доллара в конце, он вернет только последнее совпадение (потому что $ означает "конец строки" в регулярном выражении).

Когда я попробовал это сделать, оно совпало ": USA" скорее, чем "USA" и чтобы исправить это, вы можете добавить .*: (обратите внимание на пробел после двоеточия) до конца строки. (?<= ) группа, а затем вы можете заменить целое .[^\d]*\b часть за частью \w+ (\w это "словесный символ").

Итак, все это вместе дает:

(?<=(?i)((C)0230).*((R)1410).*((S)\.05.02).*(life obligations).*: )\w+$


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


Ehsan Sajjad

я ограничен здесь только использованием регулярных выражений, ваше предложение поможет, я думаю, вы имеете в виду, что ввод $ will заставляет его просто захватить конец строки матча ?

Thomas Daniels

$ означает "конец строки", так что это будет соответствовать последовательности "словесных символов", за которой сразу же следует конец строки.

Ehsan Sajjad

хорошо, отлично, так что давайте скажем в другом примере, что у меня нет названия страны в конце, в этом случае это не сработает ?

Thomas Daniels

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

Ehsan Sajjad

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

Thomas Daniels

Всегда пожалуйста!