Лучший подход для моего сопоставления с образцом

Итак, я построил регулярное выражение, которое следует за этим:

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}) короче и соответствует самому такие же случаи.

Если вы дадите лучшее описание домена, возможно, возможны и другие улучшения.

Другие вопросы по тегам