ИЛИ в Regex
Скажем, у меня
1 ABC Street
1 A ABC Street
С \d
он соответствует 1 (что я ожидаю) с \d \w
, он соответствует 1 A (ожидается). Теперь я объединяю шаблон вместе \d|\d \w
, он соответствует только первому, но игнорирует второй.
Мой вопрос заключается в том, как правильно использовать или правильно в этом конкретном случае?
PS: Условие обертывает номер только тогда, когда после него нет ни одной буквы, иначе оберните число и одну букву.
Например: 1 ABC-стрит соответствует только номеру 1, но когда 1 A ABC-стрит завершает 1 A
Ответы
Ответ 1
Try
\d \w |\d
или добавьте положительный результат, если вы не хотите включать в пробежку пробел
\d \w(?= )|\d
Если у вас есть две альтернативы, где один является расширением другого, сначала поставьте более длинный, иначе он не будет иметь возможности быть сопоставленным.
Ответ 2
Классическое "или" будет |
, Например, ab|de
будет соответствовать любой стороне выражения.
Тем не менее, для чего-то вроде вашего случая вы можете использовать ?
квантификатор, который будет соответствовать предыдущему выражению ровно 0 или 1 раз (предпочтительнее 1 раз; т.е. это "жадное" совпадение). Другой (вероятно, более надежной) альтернативой будет использование пользовательской группы символов:
\d+\s+[A-Z\s]+\s+[A-Z][A-Za-z]+
Этот шаблон будет соответствовать:
-
\d+
: одно или несколько чисел. -
\s+
: один или несколько пробелов. -
[AZ\s]+
: один или несколько заглавных или пробельных символов -
\s+
: один или несколько пробелов. -
[AZ][A-Za-z\s]+
: символ в верхнем регистре, за которым следует по крайней мере еще один символ (в верхнем или нижнем регистре) или пробелы.
Если вы хотите более статическую проверку, например, действительно сопоставлять только ABC
и A ABC
, то вы можете объединить (не совпадающую) группу и определить альтернативы внутри (чтобы ограничить область действия):
\d (?:ABC|A ABC) Street
Или другой вариант с использованием квантификатора:
\d (?:A )?ABC Street
Ответ 3
Я думаю, что вам нужно просто:
\d( \w)?
Обратите внимание, что ваше регулярное выражение тоже сработало бы, если оно было написано как \d \w|\d
вместо \d|\d \w
.
Это потому, что в вашем случае, когда регулярное выражение соответствует первому варианту, \d
, он перестает искать новое совпадение, так сказать.