Извлечение 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+ будет соответствовать чему-либо еще после этого.