JavaScript - регулярное выражение для проверки строки на наличие заглавных и строчных букв - PullRequest
2 голосов
/ 19 января 2020

Мне нужно регулярное выражение для проверки, если фамилии не содержат все строчные или прописные буквы, например: d'Arras, de Clemente

Я использую следующее регулярное выражение, однако оно разрешить все буквы в верхнем или нижнем регистре

/^[a-z ,.'-]+$/i

Каков наилучший способ проверки таких фамилий? Фамилия может начинаться с буквы в нижнем или верхнем регистре, но не все буквы должны быть в верхнем или нижнем регистре

Ответы [ 3 ]

0 голосов
/ 19 января 2020

Попробуйте это:

const
  check = (name, delimiter) =>
    name.split(delimiter).every(part =>
      ![part.toLowerCase(), part.toUpperCase()].includes(part)),

  isValidName = check('Lorem, ipsum', ',');

console.log(isValidName);

Если для вас важно использовать Regex, вы можете переписать его следующим образом:

const
  check = (name, delimiter) =>
    name.split(delimiter).every(part =>
        part.match(/(?<=[A-Z])[a-z]|(?<=[a-z])[A-Z]/));

  isValidName = check('Lorem, ipsum', ',');

console.log(isValidName);

Обратите внимание, что в обоих случаях однобуквенные имена будут считаться недействительными.

0 голосов
/ 20 января 2020

Вы можете использовать кросс-браузерное регулярное выражение, например

/^(?![A-Z ,.'-]+$)(?![a-z ,.'-]+$)[a-zA-Z ,.'-]+$/

. Оно содержит только два негативных взгляда, которые поддерживаются всеми современными браузерами. См. regex demo .

Детали шаблона

  • ^ - начало строки
  • (?![A-Z ,.'-]+$) - не допускаются только заглавные буквы, пробелы, запятые, точки, апострофы и дефисы до конца строки
  • (?![a-z ,.'-]+$) - только строчные буквы, пробелы, запятые, точки, апострофы и дефисы до конца строки не допускаются
  • [a-zA-Z ,.'-]+ - 1+ буквы ASCII, пробелы, запятые, точки, апострофы и дефисы
  • $ - конец строки.

JS демо:

var strs = ['abc A','ssss, S','abc','abc 12 A'];
var rx = /^(?![A-Z ,.'-]+$)(?![a-z ,.'-]+$)[a-zA-Z ,.'-]+$/;
for (var i=0; i<strs.length; i++) {
  console.log(strs[i], '=>', rx.test(strs[i]));
}
0 голосов
/ 19 января 2020

Регулярное выражение (.*[a-z].*[A-Z].*)|((.*[A-Z].*[a-z].*)) проверит наличие прописных и строчных букв. Одна из проблем, с которой вы столкнулись, заключается в том, что вы используете флаг i, что означает, что регулярное выражение не заботится о регистре. Кроме того, он должен проверять наличие заглавной буквы отдельно от строчной. Наличие обоих вариантов для каждой буквы означает, что все они могут быть одним случаем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...