Регулярное выражение, чтобы проверить, все ли слова имеют название

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

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)+/

Вот моя логика:

  1. Начать с границы слова
  2. Совпадение с заглавными буквами
  3. Совпадение ноль или более строчных букв
  4. Совпадение ноль или более пробелов
  5. Сопоставить границу слова
  6. Повторите вышеуказанное один или несколько раз

Что не так с моим мышлением?

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
Другие вопросы по тегам