Требуется регулярное выражение с некоторыми проверками для поля адреса - PullRequest
0 голосов
/ 16 июня 2020

Допустимые символы: [a-zA-Z0-9- /.#,], но

  1. Пробел должен предшествовать знаку фунта.
  2. Пробелов быть не должно. непосредственно перед или после da sh.
  3. Адрес не должен начинаться с #, - или /.
  4. Адрес не должен заканчиваться на #, - или /.
  5. SLA sh должен быть окружен цифрами.
  6. Тройные буквы не допускаются сразу после цифры c.
  7. В поле адреса нет отдельных символов, за исключением N , S, E и W

Так может ли кто-нибудь подсказать мне, как это сделать? Любая помощь приветствуется. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Я предположил, что «пробел» - это пробел, и не выполнил требование №7, потому что не понимаю, что оно означает. После прояснения пункта 7 я попытаюсь изменить следующее регулярное выражение.

^(?!#|.*[^ ]#)(?!.*(?: -|- ))(?!.*(?:\D\/|\/\D))(?!.*\d[A-Za-z]{3})(?![/-])[a-zA-Z0-9- /.#,]*(?<![#/-])$

Запустите свой движок!

Обратите внимание, что регулярное выражение содержит 5 отрицательный просмотр назад ((?!...)), три из которых начинаются с использования нуля или более символов, кроме символов конца строки ((?!.*...)), и один отрицательный просмотр назад в конце ((?<![#/-]) и нет группы захвата. Отрицательные опережающие просмотры реализуют следующие утверждения (по порядку):

  • знак фунта '#' должен предшествовать запятой;
  • перед дефисом не может быть или после пробела; перед
  • перед косой чертой должна стоять цифра; и за
  • цифрами не может следовать 3 буквы.
  • строка не может начинаться с '/' или '-'

Обратите внимание, что первое из этих требований гарантирует, что строка не начинается со знака фунта.

Javascript Механизм регулярных выражений выполняет следующие операции.

^                  : match beginning of string
(?!                : begin negative lookahead
  #                : match '#'
  |                : or
  .*[^ ]#          : match  0+ chars then char other than a space then '#'
)                  : end negative lookahead
(?!                : begin negative lookahead
  .*               : match 0+ chars other than newlines
  (?: -|- )        : match ' -' or '- '
)                  : end negative lookahead
(?!                : begin negative lookahead
  .*               : match 0+ chars other than newlines
  (?:              : begin a non-capture group
    \D\/           : match a non-digit followed by '/' 
    |              : or
    \/\D           : match '/' followed by a non-digit
  )                : end non-capture group
)                  : end negative lookahead
(?!                : begin negative lookahead
  .*               : match 0+ chars other than newlines
  \d[A-Za-z]{3}    : match a digit, then 3 letters
)                  : end negative lookahead
(?!                : begin negative lookahead
  [/-]             : match '/' or '-'
)                  : end negative lookahead
[a-zA-Z0-9- /.#,]* : match 0+ chars in char class
(?<![#/-])         : match '#', '/' or '-' in negative lookbehind
$                  : match end of string
0 голосов
/ 16 июня 2020
  • В регулярных выражениях обычно легче думать о том, что разрешено, а не о том, что запрещено. Например:

    • Пробел должен предшествовать знаку фунта, лучше перефразировать его как «пустое поле, за которым следует знак фунта разрешено», поэтому один из компонентов будет: ( #)
    • Должен не начинаться / заканчиваться # - /. это что-то вроде ^[a-zA-Z0-9]...[a-zA-Z0-9]$ (с более широким рисунком посередине.
  • Если вы пытаетесь проверить адреса, например, почтовые адреса, подумайте, является ли это полезная вещь; есть много удивительных причуд с адресами . Какую проблему вы пытаетесь решить? Стоит ли отклонять некоторые действительные адреса, чтобы решить эту проблему?

  • Как прокомментировали другие, опубликуйте то, что вы уже пробовали, а что не сработало?

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

...