Регулярное выражение для немецкого номера дома - PullRequest
2 голосов
/ 29 мая 2020

Ищем регулярное выражение, указывающее номер дома в Германии:

Действительный номер дома:

  • 25
  • 25 a
  • 25b
  • 25-ab
  • 12-14
  • 1
  • 9
  • 21
  • 1a
  • 121 b
  • 25A
  • 25 a

Недействительный номер дома:

  • 1 a1
  • 1a1
  • 12ab12
  • 0
  • b
  • 0a
  • 00a
  • aa
  • 00 a
  • 13àâäèéë

Последний пример исключает все нелатинские символы

Мое регулярное выражение не соответствует пути он должен:

\d+(\s|-)?\w*$

РЕДАКТИРОВАТЬ: Извините, мне пришлось изменить приведенные выше примеры! Пожалуйста, посмотрите!

Ответы [ 3 ]

4 голосов
/ 29 мая 2020

Делая предположение (поскольку вы их не предоставили), это также должно исключать такие шаблоны, как 12-a1, 12-1a, 12-01 и 12-A1. Если да, то возможно:

^[1-9]\d*(?:[ -]?(?:[a-zA-Z]+|[1-9]\d*))?$

См. Онлайн-демонстрацию


  • ^ - Начало строки ancor.
  • [1-9]\d* - один di git из диапазона 1-9, за которым следует ноль или более цифр.
  • (?: - 1-я группа без захвата.
    • [ -]? - необязательный пробел или дефис.
    • (?: - 2-я группа без захвата.
      • [a-zA-Z]+|[1-9]\d* - один или несколько символов из a-zA-Z или single di git из диапазона 1-9, за которым следует ноль или более цифр.
    • ) - Закрытие 2-й группы без захвата
  • ) - Закрытие 1-й группы без захвата
  • ? - Необязательно 1-й группа без захвата (чтобы разрешить использование однозначных номеров).
  • $ - Конечная строка ancor.

Regular expression visualization

3 голосов
/ 29 мая 2020

Вы можете сделать пробел или дефис необязательными [-\s]? и объединить символы из 1+ слов в необязательной группе.

Если номер дома не может начинаться с нуля, вы можете начать сопоставление с [1-9]

^[1-9]\d*(?:[-\s]?\w+)?$

Regex demo

Соответствие только az или 0-9 или AZ, если 25 A также действительны

^[1-9]\d*(?:[-\s]?[a-zA-Z0-9]+)?$

Демо Regex

0 голосов
/ 29 мая 2020

Сначала возникает вопрос, хорошая ли это идея или нет… (см. Различные статьи под заголовком «Ложь, которую программисты верят в XYZ»). Я не в Германии, а в соседней Австрии, и мой адрес не соответствует ни одному из ваших примеров. . (Есть два способа записать его, и ни один из них не соответствует ни одному из ваших.)

Помимо этого:

  1. Какие совпадения вы ожидаете, но не совпадают?
  2. Что не соответствует тому, что вы ожидаете?
  3. Какой диалект регулярных выражений вы используете?

Некоторые очевидные проблемы:

\d+(\s|-)?\w*$
   ^^^^^^^^^^

* соответствует 0 экземплярам. Итак, вы разрешаете da sh или пробел, за которым не следует никаких символов. Наверное, не то, что вы хотели. Попробуйте:

\d+((\s|-)?\w+)?

Это сделает весь буквенный блок необязательным, но в нем всегда должна быть буква.

Кстати, буквы \w не являются цифрами. Поэтому вам нужно явно разрешить их.

\d+ будет соответствовать 1 или более цифрам, а не «числу без префикса 0». Если ваш первый di git не должен быть равен нулю, вам нужно будет четко указать это: [1-9]\d*.

У вас есть символ соответствия конца $, но нет совпадения начала ^. Вероятно, вам нужно либо ничего, либо оба, в зависимости от того, является ли ваша проверка регулярного выражения типом «совпадение» или «поиск». (то есть, если ваш вызов библиотеки регулярных выражений пытается проверить всю входную строку или соответствует ли какая-либо подстрока.)

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