Лучший подход для моего сопоставления с образцом
Итак, я построил регулярное выражение, которое следует за этим:
4! А2! А2! С [3! С]
который переводится на
- 4 буквенных символа с последующим
- 2 буквенных символа, за которыми следуют
- 2 символа, за которыми следует
- 3 необязательных персонажа
это стандартный формат SWIFT BIC с кодом HSBCGB2LXXX
мое регулярное выражение, чтобы вытащить это из строки:
(?<=:32[^:]:)(([a-zA-Z]{4}[a-zA-Z]{2})[0-9][a-zA-Z]{1}[X]{3})
Теперь он нацелен на определенный тег (32) и работает, однако я не уверен, является ли он самым чистым, плюс, если есть символы перед H, то он потерпит неудачу.
сопоставляемая строка:
:32B:HsBfGB4LXXXHELLO
следующие возвращения HSBCGB4LXXX
, но это:
:32B:2HsBfGB4LXXXHELLO
ничего не возвращает.
РЕДАКТИРОВАТЬ
Для ясности. У меня есть строка, которая содержит несколько строк, все начинающиеся с:2xnumber: необязательная буква (например,:58A:) Я хочу указать строку для начала сопоставления и вернуть BIC из любой точки строки.
РЕДАКТИРОВАТЬ Еще несколько примеров данных, чтобы помочь:
:20:ABCDERF Z
:23B:CRED
:32A:140310AUD2120,
:33B:AUD2120,
:50K:/111222333
Mr Bank of Dad
Dads house
England
:52D:/DBEL02010987654321
address 1
address 2
:53B:/HSBCGB2LXXX
:57A://AU124040
AREFERENCE
:59:/44556677
A line which HSBCGB2LXXX contains a BIC
:70:Another line of data
:71A:Even more
Итак, мне нужно передать в качестве переменной тег 53 или 59 и вернуть только BIC HSBCGB2LXXX!
2 ответа
Ваше регулярное выражение может быть упрощено и исправлено, чтобы позволить персонажу до H
, чтобы:
:32[^:]:.?([a-zA-Z]{6}\d[a-zA-Z]XXX)
Внесенные изменения:
- Потерял взгляд позади - просто сделай это частью матча
- Вставка
.?
что означает "необязательный символ" ([a-zA-Z]{4}[a-zA-Z]{2})
==>[a-zA-Z]{6}
(4 + 2 = 6)[0-9]
==>\d
(\d
означает "любая цифра")[X]{3}
==>XXX
(просто легче читать и меньше символов)
Группа 1 матча содержит вашу цель
Я не совсем уверен, полностью ли я понимаю ваш вопрос, поскольку ваше регулярное выражение не полностью соответствует тому, что вы описали выше. Например, вы упомянули 3 необязательных символа, но в регулярном выражении вы используете 3 обязательных X-ов.
Однако фактическое регулярное выражение может быть дополнительно очищено:
- вместо [a-zA-Z]{4}[a-zA-Z]{2} вы можете просто использовать [a-zA-Z]{6}, и группировка скобок вокруг этого может быть ненужной;
- {1} может быть опущен без каких-либо изменений в результате;
- X не нуждается в окружающих скобках.
В целом (?<=:32[^:]:)([a-zA-Z]{6}[0-9][a-zA-Z]X{3}) короче и соответствует самому такие же случаи.
Если вы дадите лучшее описание домена, возможно, возможны и другие улучшения.