#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я хочу создать одно регулярное выражение длиной 10-20, которое должно содержать комбинацию по крайней мере из 1 строки и 1 числа, не может содержать ничего другого, и первый символ должен быть строкой. Я пытался
(?=.*[A-Za-z])(?=.*d)[A-Za-z0-9]{10,20}
но это соответствует таким вещам, как <73010825822784709>d
что не является оптимальным, любая помощь?
Комментарии:
1. Используйте якоря,
^(?=.*[A-Za-z])(?=.*d)[A-Za-z0-9]{10,20}$
2. Да, но цель, с которой я пишу это регулярное выражение, заключается в том, чтобы я мог обнаруживать строки, которые находятся в конце URL, например youtube.com/abcDeFg1234 , Я хочу, чтобы оно определяло последнюю последовательность, чего я не могу сделать с помощью якорей.
3. Отлично, тогда
//(?=d*[A-Za-z])(?=[a-zA-Z]*d)[A-Za-z0-9]{10,20}$/
подойдет (если URL-адрес находится в конце строки). Если нет, вам нужно указать, чем обозначается конец URL-адреса.4. Opps Я думаю, я не был конкретен, я создаю это регулярное выражение для сервера discord, который содержит сообщения, пожалуйста, сделайте так, чтобы оно обнаруживало последовательности типа «эй, ребята, проверьте youtube.com/abcDeFg1234 это потрясающе!» тогда это будет работать идеально
5. Тогда это будет выглядеть
//(?=d*[A-Za-z])(?=[a-zA-Z]*d)[A-Za-z0-9]{10,20}(?!S)/
Ответ №1:
Используйте
//(?=d*[A-Za-z])(?=[a-zA-Z]*d)[A-Za-z0-9]{10,20}b/
Смотрите доказательство
ОБЪЯСНЕНИЕ
NODE EXPLANATION
--------------------------------------------------------------------------------
/ '/'
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
d* digits (0-9) (0 or more times (matching
the most amount possible))
--------------------------------------------------------------------------------
[A-Za-z] any character of: 'A' to 'Z', 'a' to 'z'
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
(?= look ahead to see if there is:
--------------------------------------------------------------------------------
[a-zA-Z]* any character of: 'a' to 'z', 'A' to 'Z'
(0 or more times (matching the most
amount possible))
--------------------------------------------------------------------------------
d digits (0-9)
--------------------------------------------------------------------------------
) end of look-ahead
--------------------------------------------------------------------------------
[A-Za-z0-9]{10,20} any character of: 'A' to 'Z', 'a' to 'z',
'0' to '9' (between 10 and 20 times
(matching the most amount possible))
--------------------------------------------------------------------------------
b the boundary between a word char (w) and
something that is not a word char
Комментарии:
1. Последний запрос, не могли бы вы, пожалуйста, добавить требование иметь как минимум 2 строки с заглавной буквы?
2. Похоже на то, что я придумал: (?=.*[a-z])(?=(.*[A-Z]){2,})(?=.* d) [a-zA-Z d]{10,20} работает, поскольку я не очень хорошо разбираюсь в регулярных выражениях, можете ли вы проверить, соответствует ли оно всем условиям?
3. @ForeverClueless Да,
(?=(.*[A-Z]){2,})
подойдет, хотя(?=(?:[^A-Z]*[A-Z]){2})
будет лучше.4. @ForeverClueless Да, совет Виктора хорош.
.*
является жадным и менее эффективным, чем[^A-Z]*
.