Первое замечание: [0-9]
упрощается до \d
в большинстве ситуаций - намного проще читать и писать.
Когда вы хотите чередовать два шаблона и точно более короткий соответствует другому до конца более короткого, вы можете поставить более длинный первым.То есть вместо:
\b(
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
|
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2} ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US
)\b
(начальные пробелы и символы новой строки предназначены только для ясности группировки)
вы можете сделать
\b(
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2} ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US
|
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
)\b
https://regex101.com/r/8CVhJ2/1
Но есть и лучший вариант: почему бы не сопоставить более короткую часть независимо от , а затем опционально сопоставить оставшуюся часть более длинного шаблона:
\b
9\d{3} ?\d{4} ?\d{4} ?\d{4} ?\d{4} ?\d{2}
(?: ?[a-z]{2} ?\d{3} ?\d{3} ?\d{3} ?US)?
\b
https://regex101.com/r/8CVhJ2/2
Вы также можете упростить вышесказанное, повторив последовательные подшаблоны \d{4} ?
в группе:
\b
9\d{3} ?(?:\d{4} ?){4}\d{2}
(?: ?[a-z]{2} ?(?:\d{3} ?){3}US)?
\b
все в одной строке:
\b9\d{3} ?(?:\d{4} ?){4}\d{2}(?: ?[a-z]{2} ?(?:\d{3} ?){3}US)?\b