Одно регулярное выражение с одной строкой и комбинацией чисел с несколькими другими требованиями

#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]* .