Регулярное выражение, чтобы проверить, все ли слова имеют название
Я пытаюсь придумать регулярное выражение, чтобы подтвердить следующее:
This Is A Cat
Тем не менее, чтобы оценить следующее, чтобы быть ложным:
This is a cat
Или это тоже будет ложью:
This Is A cat (Note the 'c' is not upper case in Cat)
Я пытаюсь в JavaScript, думал, что должно работать следующее:
/(\b[A-Z][a-z]*\s*\b)+/
Вот моя логика:
- Начать с границы слова
- Совпадение с заглавными буквами
- Совпадение ноль или более строчных букв
- Совпадение ноль или более пробелов
- Сопоставить границу слова
- Повторите вышеуказанное один или несколько раз
Что не так с моим мышлением?
3 ответа
Что не так с моим мышлением?
Вы находите последовательность слов в заглавных буквах, но это не подходит для случаев, когда есть слова без заглавных букв.
Вы можете проверить, не является ли весь ввод не регистром заглавия с помощью простого регулярного выражения:
const tests = ['This Is A Cat', 'This is a cat', 'This Is A cat'];
// Is there any occurrence of a word break followed by lower case?
const re = /\b[a-z]/;
tests.forEach(test => console.log(test, "is not title case:", re.test(test)));
Если вы действительно хотите проверить, что ввод является регистром заголовка, то вам нужно будет сопоставить строку от начала до конца, как упомянуто в комментарии (т. Е. "Привязать" регулярное выражение):
const tests = ['This Is A Cat', 'This is a cat', 'This Is A cat'];
// Is the entire string a sequence of an upper case letter,
// followed by other letters and then spaces?
const re = /^\s*([A-Z]\w*\s*)*$/;
tests.forEach(test => console.log(test, "is title case:", re.test(test)));
Что такое заглавие дела?
Строго говоря, однако, статьи, союзы и предлоги не пишутся в верхнем регистре, если они не начинаются с названия. Поэтому лучшим тестом будет:
const re = /^\s*[A-Z]\w*\s*(a|an|the|and|but|or|on|in|with|([A-Z]\w*)\s*)*$/;
Если вы хотите знать только, соответствует ли строка условию, и вам все равно, где она не выполняется, вы можете проверить либо строчную букву в начале строки, либо строчную букву, которая следует за пробелом:
var str = 'This Is A Cat';
if (str.match(/\b[a-z]/)) {
console.log('Not Title Case');
}
var str2 = 'This is A Cat';
if (str2.match(/\b[a-z]/)) {
console.log('Example 2 Is Not Title Case');
}
var str3 = 'this Is A Cat';
if (str3.match(/\b[a-z]/)) {
console.log('Example 3 Is Not Title Case');
}
Я предполагаю, что вы забыли включить глобальный знак соответствия g
в конце.
g
находит все совпадения, а не останавливается после первого совпадения
Попробуйте сделать это так:
/(\b[A-Z][a-z]*\s*\b)+/g