2013-04-18 3 views
0

Я отфильтровываю SSN # для проекта. по умолчанию выражение продукта для ПНУЛ являетсяСоответствующие SSN с RegEx

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

Была модификация в прошлом для их индивидуального сценария с регулярным выражением:

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

Разница между двумя выражениями

(\b|$) 
\b: backspace 
$:end of string 

И

($|[^\d-]) 
$:end of string 
[^]: Not in position 
\d-: not match 0-9 

Я думаю, это не имеет смысла для меня. Почему было сделано изменение? Оба конца этих выражений кажутся излишними. Любая помощь будет оценена по достоинству. Спасибо!

ответ

0

разница здесь:

(\b|$) 

против

($|[^\d-]) 

\b только представляет забой символ внутри класса символов, как [\babc] будет соответствовать 'а', 'B', 'C', или символ возврата. Вне класса символов, который является тем, что видно здесь, это разрыв слов, например, между буквой и пробелом.

Ранее регулярное выражение могло принимать SSN, сопоставляя шаблон с этой точкой, заканчивая концом строки ($) или любым словом break (\b). Таким образом, он будет соответствовать SSN в данных «111-22-3333» или «111-22-3333 мусора»

После изменения, как правило, более разрешительно то, что следует за SSN. Он может заканчиваться концом строки ($) или любым символом, отличным от цифры или дефиса ([^\d-]). Таким образом, как и то, что соответствовало выше, оно также соответствовало бы SSN в «111-22-3333garbage» или «111-22-3333 # 6789», но не в «111-22-33333» или «111-22 -3333-123 "

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

Смежные вопросы