Извлечение ICCID из строки с помощью регулярных выражений

Я пытаюсь вернуть и распечатать ICCID SIM-карты на устройстве; SIM-карты от разных поставщиков и, следовательно, разной длины (19 или 20 цифр). В результате я ищу регулярное выражение, которое будет извлекать ICCID (таким образом, что это не зависит от словесных символов, непосредственно окружающих его).

Учитывая, что ICCID указан как строка из 19-20 цифр, начинающаяся с "89", я просто выбрал:

(89\d{17,18})

Это был самый успешный шаблон, который я тестировал (наряду с некоторыми шаблонами, отклоненными по причинам ниже).

В строке, из которой я извлекаю ее, сразу после ICCID следует возврат каретки, а затем перевод строки, но некоторые тесты против его завершения \r, \n, или даже \b не работает (программа, которую я использую, является собственной, построенной на python, поэтому я подозреваю, что именно она используется для регулярных выражений). Кроме того, просто используя (\d{19,20}) в итоге извлекли последние 19 цифр из 20-значного ICCID (в качестве третьего и последнего действительного совпадения). В том же духе я исключил (\d{19,20})? в принципе, как я ожидаю, это закончится, когда он найдет первые 19 цифр.

Поэтому мой вопрос: должен ли я использовать выбранный мной шаблон или есть лучшее выражение (без использования несловесных символов для обрамления строки), которое будет возвращать самую длинную подстроку из строки цифр переменной длины?

3 ответа

Решение

Если закулисным движком действительно является Python, и могут быть любые нецифровые символы вокруг значения, которое нужно извлечь, используйте обходные пути, чтобы ограничить контекст вокруг значений:

(?<!\d)89\d{17,18}(?!\d)
^^^^^^^         ^^^^^^

(?<!\d) перед боем потребуется отсутствие цифры перед матчем и (?!\d) отрицательный прогноз потребует отсутствия цифры после этого значения.

Смотрите это регулярное выражение

Я бы пошел на

89\d{17,18}[^\d]

Это должно предпочесть 18 цифр, но 17 также будет достаточно. После этого больше никакие другие числовые символы не будут разрешены.

Единственное ограничение: после ICCID должен быть хотя бы еще один символ (что должно быть в порядке с тем, что вы описали).

Помните, что любая более длинная числовая последовательность, содержащая "89", за которой следуют 17 или 18 числовых символов, также будет соответствовать.

(\d+)\D+ 

Кажется, что это с готовностью добьется цели. (\d+) будет захватывать 20 номеров. \D+ будет соответствовать чему-либо еще после этого.

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