Regex помощь, специфичная для Spamassassin - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь создать фильтр для номеров социального страхования и иметь следующее регулярное выражение:

\b(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}\b

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

18-007-08-9056-1462-2205

Я бы хотел, чтобы это совпадало, только если строка SSN сама по себе.Примеры:

18 007-08-9056 1462-2205
007-08-9056
xyz 007-08-9056
007-08-9056 xyz

Ответы [ 2 ]

2 голосов
/ 25 июня 2019

Утверждение \b является границей слова - оно соответствует любому местоположению, которое переходит от символа слова к символу, не являющемуся словом. Цифры являются символами слова, а дефисы - нет. Чтобы указать границу пробела, вы можете использовать lookarounds:

(?<!\S)(?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}(?!\S)

Это указывает на то, что перед шаблоном нет ни пробела, ни после. Внешний вид позволяет вам указать это, все еще сопоставляя начало или конец строки.

2 голосов
/ 25 июня 2019

Ваша проблема в том, что \b соответствует границе слова, а - считается границей слова. Вы можете попробовать что-то вроде этого:

(?:^|[^-\d])((?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4})(?:$|[^-\d])

Матч будет доступен в $1. Возможно, вам удастся найти более элегантное решение на основе вашего конкретного типа входных строк. (Например, у SSN всегда будут пробелы? Если это так, вы можете использовать \s и т. Д.)

...