2015-11-13 3 views
2

Я пытаюсь создать функцию с регулярным выражением, которое может решить, правильное ли мое строковое значение или нет. Он должен быть true, если строка начинается с нижнего или верхнего регистра алфавитного символа или подчеркивания. Если он начинается с любых других, функция должна вернуть false.Regex возвращает с неправильным значением

Мой тестовый вход что-то вроде этого: ".dasfh"

выражения, что я пытался использовать: [_a-zA-Z] ... [:alpha:] ..., но оба они вернулись верно.

Я попытался немного более легкая задача также:

"Hadfg" где выражение [a-z] ...: возвращает true

НО

"hadfg" где выражение [A-Z] ...: возвращает false

Может ли кто-нибудь помочь мне понять это поведение?

+1

Что вам нужно сделать? Подтвердить? Примечание. JS не поддерживает классы символов POSIX, такие как '[: alpha:]'. Попробуйте ['/^[a-z_]/i'](https://regex101.com/r/fX2iX4/2), если проверенная строка должна начинаться с нижнего или верхнего алфавитного символа или подчеркивания *. –

+0

https://regex101.com/r/iH6kV3/1 – Blag

ответ

5

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

Regex engine просто пытается найти любой матч во всей строке.

Все, что вы говорите с [a-z], «найдет меня строчным символом в любом месте строки». Это означает, что:

"Hadfg" будет равен true, так как он может найти a, d, f или g в качестве совпадения. "HADFG" будет равен false, потому что нет строчных букв.

то же самое будет происходить по "hADFG" при сопоставлении с [A-Z], например, он сможет найти A, D, F или G в качестве соответствия, тогда как "hadfg" возвратит ложь, потому что не существует символ верхнего регистра.

Что вы ищете здесь в своем регулярном выражении ^, это особый вид модификатора, что означает «начало строки»

Итак, когда вы применить это к вашему регулярному выражению будет выглядеть следующим образом: /^[a-z]/.
Регулярное выражение на предыдущей строке в основном говорит «с начала строки, это первый символ, следующий за строчным a-z?»

Попробуйте, и вы увидите.

Для вашего решения вам понадобится /^[_a-zA-Z]/, чтобы проверить, является ли первый символ символом _, a-z или A-Z.

Для справки вы можете найти cheatsheets в этих инструментах (и протестируйте его регулярные выражения с ним, конечно!)

  1. Regexr - Мой личный фаворит (использует ваши браузеры JS движок регулярных выражений)
  2. Rubular - рубин регулярное выражение тестер
  3. Regex101 - Python,/PCRE/PHP/JavaScript

И ссылку или учебник (я бы рекомендовал прочитать от начала до конца, если вы хотите начать понимать regexp и как они работают) theres regular-expressions.info.

Regex никогда не бывает легким и быть осторожным с тем, что вы делаете с ним, это мощный, но иногда некрасиво животное, чтобы иметь дело с :)

PS

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

[email protected]+\..{2,}

, который когда распались, выглядит следующим образом:

.+ - один или более любых символов
@ - за которыми следует символ @
.+ - один или более любых символов
\. - а затем литерал. характер
.{2,} - два или более любых символов

При желании можно заменить {2,} с +, чтобы сделать это один или более, но это позволило бы TLD с 1 символов.

Чтобы увидеть RFC-письмо с регулярным выражением на рабочем месте, проверьте this link. Когда я смотрю на это регулярное выражение, я в принципе просто хочу заплакать в углу где-то, есть определенные вещи, которые вы не можете сделать в адресе электронной почты, который не задает мое регулярное выражение, но по крайней мере он уверен, что это то, что выглядит как it's e-mailable в любом случае, если новый пользователь решает заполнить какой-то бык, который больше не является моей проблемой, и я бы не хотел, чтобы они меняли этот символ 1 только потому, что огромное регулярное выражение тоже не соглашается с ним.

+0

Спасибо за ваш быстрый и понятный ответ. Он работает правильно. – Zse

+0

@ Здорово, что я могу помочь, получаю удовольствие от развития :) – SidOfc

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