У меня есть условие строки в js, где я должен проверить, содержит ли имя, введенное в текстовое поле, только одно пространство.
pattern: name.status === 'full_name' ? /^[a-zA-Z.+-.']+\s+[a-zA-Z.+-. ']+$/ : /^[a-zA-Z.+-. ']+$/
Но указанное выше регулярное выражение также совпадает с именами, заканчивающимися на 2 пробела.
Мне нужно сопоставить его так, чтобы введенное имя принимало только одно пространство для строки имени. Таким образом, имя будет иметь только одно пространство между ними или в конце.
вы также можете использовать границы слов...
function isFullName(s) {
return /^\b\w+\b \b\w+\b$/.test(s);
}
['Giuseppe', 'Mandato', 'Giuseppe Mandato']
.forEach(item => console.log('isFullName ${item} ? ${isFullName(item)}'))
Два замечания: 1) \s+
в вашем шаблоне соответствует 1 или более пробелов, и 2) [+-.]
Матчи 4 символов: +
, ,
, -
и .
, поэтому лучше всего положить дефис в конце класса символов.
Вы можете использовать
/^[a-zA-Z.+'-]+(?:\s[a-zA-Z.+'-]+)*\s?$/
подробности
^
- начало строки[a-zA-Z.+'-]+
- 1 или более букв .
, +
, '
или -
(?:\s[a-zA-Z.+'-]+)*
- нулевая или более последовательность: \s
- одиночный пробел[a-zA-Z.+'-]+
- 1 или более букв .
, +
, '
или -
символы\s?
- необязательный пробел$
- конец строки. Примечание: если "имена" не могут содержать .
и +
, просто удалите эти символы из ваших классов символов.
/^\S+\s\S+$/
попробуй это
Некоторые объяснения:
\s
равно [\r\n\t\f\v ]
, оно также line return
...
\n
, это не проблема (но да, сопоставление разрывов строк); поэтому используйте что-то вроде /^[^ \t]+[ \t][^ \t]+$/
например