Объясните регулярное выражение / ^ [a-zA-Z] * /

0

Я понимаю, что шаблон регулярного выражения должен соответствовать строке, которая начинается с комбинации и повторения следующих символов:

  1. az
  2. AZ
  3. a white-space character

И нет никаких ограничений на то, как строка может закончиться!


Первый случай

Таким образом, строка, такая как uoiui897868 (любая строка, которая начинается только с пробела, az или AZ), соответствует шаблону... (уверена, что это так)

Второй случай

Но проблема заключается в строке, такой как 76868678jugghjiuh (любая строка, которая начинается только с символа, кроме пробела, az или AZ) тоже соответствует! Этого не должно быть!


Я также проверил использование функции php preg_match(), которая возвращает true (т.е. Шаблон соответствует строке). Также использовались другие онлайн-инструменты, такие как regex101 или regexr.com. Строка соответствует шаблону. Может ли кто-нибудь помочь мне понять, почему шаблон соответствует строке, описанной во втором случае?

  • 1
    ^ Означает «начало строки», поэтому регулярное выражение означает «начинается с» любого количества букв или пробелов. Обратите внимание, что * означает «0 или более».
  • 2
    И * означает «любое количество», в том числе zilch.
Показать ещё 8 комментариев
Теги:
string

4 ответа

5
Лучший ответ

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

Это потому, что

  • с ^, вы обеспечиваете начало строки, теперь каждая строка имеет начало.
  • Вы используете группу [A-Za-z ], но вы используете оператор *, поэтому 0 или более повторений. Таким образом, даже если строка не содержит (или начинается с) символа из [A-Za-z ], совпадение просто скажет: нулевые совпадения и разобрать оставшуюся строку.

Вам нужно использовать + вместо * для принудительного применения "по крайней мере одного символа".

  • 0
    Да, конечно!! Это ясно объясняет проблему сейчас !!
5
/^[a-zA-Z ]*/

Ваше регулярное выражение будет соответствовать строкам, которые "начинаются с" любого числа (включая ноль) букв или пробелов.

^ означает "начало строки" и * означает "ноль или больше".

Оба uoiui897868 и 76868678jugghjiuh начинаются с 0 или более букв/пробелов, поэтому они оба совпадают.

Вы, вероятно, хотите:

/^[a-zA-Z ]+/

" + Означает "один или несколько", поэтому он не будет соответствовать нулевым символам.

  • 0
    да, конечно ... полностью это объясняет. Спасибо
  • 0
    Пожалуйста :)
4

То, что вы действительно хотите, - это сопоставить один или несколько предыдущих символов.

Для этого вы используете +

/^[a-zA-Z ]+/
2

Конец '*' на конце означает ноль или более совпадений символа, поэтому все строки будут совпадать. Возможно, вы хотите удалить квантор подстановочных знаков или изменить его на "+" квантификатор и добавить "$" в конец для проверки всей строки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню