Мне нужна строка в JavaScript, которая может содержать одно или более слов, начинающаяся с буквы. Каждое слово может содержать цифры,буквы, тире и подчеркивание между соседними буквами/цифрами. Слова не должны начинаться и заканчиваться тире или подчеркиванием. В конце строки допустимы пробелы. Первое слово обязательно начинается с буквы и может быть длинною 1 или более.
Пока я пришел к следующему
/^[a-zA-Z]+( [a-zA-Z0-9\-\_]*)*[a-zA-Z0-9]+$/
Но оно не работает как мне нужно, к сожалению. В частности, выражение типа a s--5__f тоже пройдет тест.
Вы можете использовать
/^[a-zA-Z][a-zA-Z0-9]*(?:[-_][a-zA-Z0-9]+)*(?:\s[a-zA-Z0-9]+(?:[-_][a-zA-Z0-9]+)*)*\s*$/
См. демо выражения онлайн.
Подробности
^ - начало строки[a-zA-Z] - буква[a-zA-Z0-9]* - 0 и более букв и цифр(?:[-_][a-zA-Z0-9]+)* - 0 и более повторов дефиса или знака подчёркивания, за которыми следует 1 и боле букв/цифр(?:\s[a-zA-Z0-9]+(?:[-_][a-zA-Z0-9]+)*)* - 0 и более повторов...
\s - пробельный символ[a-zA-Z0-9]+ - 1+ букв/цифр(?:[-_][a-zA-Z0-9]+)* - 0 и более повторов дефиса или знака подчёркивания, за которыми следует 1 и боле букв/цифр \s* - 0 и более пробельных символов$ - конец строки.Пример кода:
var strs = ['fdf sdf-sdf-sdf fsd_sd_sdf sd-sd 13', 'dv d_d-dv 1_', 'sdsv d vs_dd 3-'];
var reg = /^[a-zA-Z][a-zA-Z0-9]*(?:[-_][a-zA-Z0-9]+)*(?:\s[a-zA-Z0-9]+(?:[-_][a-zA-Z0-9]+)*)*\s*$/;
for (var s of strs) {
if (reg.test(s)) {
console.log(s, '=>', true)
} else {
console.log(s, '=>', false)
}
}
Продвижение своими сайтами как стратегия роста и независимости