Я искал и пробовал ниже RegExp, но не работал для моего требования. Пожалуйста, предоставьте PHP RegExp, который принимает по крайней мере одно буквенно-цифровое и необязательное подчеркивание или дефис, но подчеркивание или дефис не должны повторяться дважды подряд.

/^([a-z0-9]+-)*[a-z0-9]+$/i

Примеры форматов

  1. _test147
  2. контрольная работа
  3. тест_тест
  4. тест-тест_ и т. д.
0
Raj Ravuri 3 Фев 2022 в 21:25
1
Вы уверены, что регулярное выражение лучше всего подходит для этого? Что ты пытаешься сделать?
 – 
Djave
3 Фев 2022 в 21:34

2 ответа

Вы можете использовать это регулярное выражение в режиме игнорирования регистра:

^[-_]?[a-z\d]+(?:[_-][a-z\d]+)*[-_]?$

Демо RegEx

Сведения о регулярном выражении:

  • ^: Начать
  • [-_]?: соответствует необязательному _ или -.
  • [a-z\d]+: совпадение 1+ буквенно-цифрового символа
  • (?:: начать группу без захвата <ул>
  • [_-]: соответствует _ или -
  • [a-z\d]+: соответствует 1+ буквенно-цифровому символу
  • )*: Завершить группу без захвата. Повторите эту группу 0 или более раз
  • [-_]?: соответствует необязательному _ или -.
  • $: конец
  • 2
    anubhava 3 Фев 2022 в 21:31
    /^([-_]?[a-z0-9]+)+[-_]?$/i
    

    Это повторяющаяся последовательность с необязательным дефисом или подчеркиванием, за которым следуют буквенно-цифровые символы, а затем допускается еще один необязательный дефис или подчеркивание в конце.

    0
    Barmar 3 Фев 2022 в 21:33
    Из-за необязательного [-_]? в повторяющейся группе потребуется гораздо больше шагов.
     – 
    anubhava
    3 Фев 2022 в 21:35
    1
    @anubhava: но если вы измените группу захвата на атомарную группу, это будет быстрее. Что бы ни выиграло это: regex101.com/r/OK4bqq/1
     – 
    Casimir et Hippolyte
    3 Фев 2022 в 21:44
    Если мы не имеем дело с очень длинными входными данными, я сомневаюсь, что это имеет значение. Вот что я имею в виду о преждевременной оптимизации. Я пишу то, что кажется самым простым.
     – 
    Barmar
    3 Фев 2022 в 21:45