Как ограничить необязательные пробелы в регулярных выражениях - PullRequest
0 голосов
/ 21 сентября 2018

YARP.(Да, еще одна проблема с регулярным выражением).

Не уверен, что самый ясный способ описать это, кроме конкретных примеров.

Пример текста:

  1. 4444 4444 4444 4444
  2. 4444444444444444
  3. 44 44 44 44 44 44 44 44
  4. 4444-4444-4444-4444
  5. 4444 (несколько пробелов) 4444 (несколько пробелов) 4444(несколько пробелов) 4444
  6. 0.4444444444444444
  7. 0.4444 4444 4444 4444

Мне нужно построить регулярное выражение, которое будет соответствовать только 1, 2 и 4.Требования 13-16 цифр, тире и пробелов необязательны, но только если один пробел и не более 3.

Это, очевидно, связано с поиском информации CC, и я провел массу исследований, обнаружил многопримеры, которые находят совпадения для большинства, все или ничего, но ничего, что устраняет чрезмерные ложные срабатывания, как 3 и 5 выше.Я использую PowerGREP 5, я прочитал весь учебник по https://www.regular -expressions.info / tutorial.html и не могу понять, как ограничить количество дополнительных пробелов в общем совпадении,то есть: «1 2 3 4 5 6 7 8 9» совпадает так же, как и «123 456 789», если я делаю пробел (ы) необязательным.По сути, я хочу, чтобы регулярное выражение заканчивало поиск совпадений, если обнаружено более 3 пробелов / тире.

Примечание: я работаю в компании, которая работает с ТОННОЙ массой календарных данных, поэтому копирование большого диска со многими текстовыми строками в стиле "1 2 3 4 5 6 7 8 ..." создает тоннуложных попаданий, даже если я потрачу время на адаптацию поиска к шаблонам с включенным CC.

Любая помощь будет очень признательна.

Ближайшее, что я нашел:

\b(?:\d[ -]*?){13,16}\b

Который захватывает любые 13-16 цифр (с учетом тире или пробела между ними), как и ожидалось, но также соответствует "1 2 3 4 5 6 7 8 9 10 11", что, очевидно, не полезно.

Регулярное выражение "все включено" CC, которое не может найти действительные номера, если они содержат пробелы / тире: (но найдет номера телефонов в Великобритании, хе):

\b(?:4[0-9]{12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|6(?:011|5[0-9]{2})[0-9]{12}|(?:2131|1800|35\d{3})\d{11})\b

Итак, я попытался заменить любой[0-9] экземпляры класса символов выше с (?: \ D [-] *?), Которые найдут действительные CC с тире / пробелами, но они также соответствуют всем "1 2 3 4 5 6 7 8 9 10 11"введите ложные срабатывания.

Я очень плохо знаком с регулярным выражением, поэтому, если я совершаю огромную ошибку noob, пожалуйста, не стесняйтесь указывать мне в правильном направлении.Спасибо!

Редактировать:

Замена [0-9] на (?: \ D [-]?) Только для больших последовательных частей строки, кажется, довольно близко к тому, что мне нужно,Выключил тот же диск, что и раньше, и получил только 311 совпадений, и все 3 найденных положительных файла, я могу жить только с 308 ложными совпадениями, но я должен представить, что есть еще лучший способ сделать это.И он по-прежнему соответствует строкам из 13-16 цифр с более чем 3 разделителями ...

Текущее регулярное выражение:

\b(?:4(?:\d[ -]?){12}(?:[0-9]{3})?|(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)(?:\d[ -]?){12}|3[47](?:\d[ -]?){13}|3(?:0[0-5]|[68][0-9])(?:\d[ -]?){11}|6(?:011|5[0-9]{2})(?:\d[ -]?){12}|(?:2131|1800|35\d{3})(?:\d[ -]?){11})\b

1 Ответ

0 голосов
/ 21 сентября 2018

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

^(\d{4}[\s\-]?){3}\d{4}$

Это соответствовало бы вашим письменным критериям,но позвольте смеси как: 1234-5678 9012.Если это неприемлемо, вы можете использовать положительный прогноз, чтобы убедиться, что шаблон повторяет то же самое

^(?=(\d{4}){3}|(\d{4}-){3}|(\d{4}\s){3})(\d{4}[\s-]?){3}\d{4}$

Первое регулярное выражение

  • Начинается с начала строки: ^
  • Находит четыре цифры (0-9), за которыми, возможно, следуют пробел или тире, и повторяет этот шаблон 3 раза: (\d{4}[\s\-]?){3}
  • Затем следуют еще четыре цифры и конецстрока: \d{4}$

Взяв всего лишь предположение со второго регулярного выражения: (?=(\d{4}){3}|(\d{4}-){3}|(\d{4}\s){3})

  • Прежде чем паттерн начинает что-то захватывать, мы снова начинаем с началастроки и посмотрите на первые три повторяющихся шаблона и убедитесь, что разделитель между ними одинаков.

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

Что касается интеграции в регулярное выражение CC, то вы лениво сопоставляете бесконечное число черточек или пробелов;Вы просто хотите ? вместо *?.Если вам нужно больше гибкости в использовании этих пробелов / чисел, но при этом ограничивать их, я бы, вероятно, использовал отрицательное регулярное выражение для проверки.

...