16 ди git номер карты в регулярном выражении - PullRequest
2 голосов
/ 24 февраля 2020

Я застрял с функцией регулярного выражения. Было довольно весело разрабатывать его, чтобы довести его до того уровня, на котором он сейчас находится, но я не могу улучшить его, даже используя другие примеры в Интернете.

У меня есть следующая функция регулярных выражений, которую я использую для определения 16-ти git номеров карт,

(?<=^|[^0-9])[0-9]{16}(?=[^0-9]|$)|[0-9]{4}[-| |_][0-9]{4}[-| |_][0-9]{4}[-| |_][0-9]{4}

Эта функция обнаруживает следующие результаты,

1) 1234123412341234 (все 16 цифр)

2) 1234 1234 1234 1234

3) 1234-1234-1234-1234 (номера карт с дефисами и пробелами)

4) Найди меня 1234-1234-1234-1234 Найди меня (номера карт скрыты в тексте)

Что я пытаюсь остановить, так это ложные срабатывания, которые я получаю, и я знаю, что Прямой результат достижения результата № 4 выше. Ложные срабатывания - это более 16 цифр, которые явно не являются номерами карт. Например,

1) 1234-1234-1234-1234-1234

При обнаружении первых 16 цифр в строке регулярное выражение возвращает значение. Я создал процедуру, которая отфильтровывает эти ложные срабатывания, но я подумал, что стоит посмотреть, сможет ли кто-то улучшить вышеперечисленное, чтобы другие могли использовать функцию регулярного выражения. Другие примеры на inte rnet, похоже, не справились со мной.

Ответы [ 2 ]

1 голос
/ 24 февраля 2020

Вы можете использовать

(?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}(?:[_ -]\d{4}){3}(?![_ -]?\d)

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

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

(?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}(?=([_ -]))(?:\1\d{4}){3}(?![_ -]?\d)

Или развернутый (без положительного взгляда):

(?<!\d)\d{16}(?!\d)|(?<!\d[ _-])(?<!\d)\d{4}([_ -])\d{4}(?:\1\d{4}){2}(?![_ -]?\d)

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

Подробности

  • (?<!\d)\d{16}(?!\d) - шестнадцать цифр, не заключенных ни в какие другие ди git
  • | - или
  • (?<!\d[ _-])(?<!\d) - местоположение, которому непосредственно не предшествует ди git или ди git и пробел / _ / -
  • \d{4} - четыре цифры
  • (?:[_ -]\d{4}){3} - три повторения _, пробел или -, а затем любые четыре цифры
  • (?![_ -]?\d) - местоположение, за которым сразу же не указывается необязательный _ / пробел или -, а затем ди git.
0 голосов
/ 24 февраля 2020

Я бы упростил все регулярные выражения до \s((\d{4}[\s-]?){3}\d{4})\s.

Разница в том, что я прошу 3 группы по 4 цифры плюс дополнительный разделитель, а затем другую группу из 4 цифр. Таким образом, у меня всегда будет 16. Помощь \s в разграничении кандидатов, вам может не понадобиться.

Тест по https://regex101.com/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...