Этот подход может быть не совсем надежным для грязных данных, вводимых из Интернета, поскольку вы, вероятно, найдете множество примеров текста, который не соответствует вашим строгим правилам. У вас есть иностранные письма в вашем сообщении. Но вот некоторый базовый c код:
Разделение текста на предложения (с использованием утверждения lookbehind):
message = "A test. Not what I wanted."
sentences = message.split(/(?<=\.)\s*/)
.map(sentence => sentence.trim())
.filter(sentence => sentence)
;
// sentences = ["A test.", "Not what I wanted."]
Все предложения начинаются с заглавной буквы (плюс необязательный пробел). Если в предложении пропущен период, этот токенизатор будет обрабатывать оба предложения как одно.
is_all_capital = sentences
.map(sentence => sentence.match(/^\s*[A-Z]/))
.every(str => !!str) // cast to boolean
;
Сообщение заканчивается точкой (плюс необязательный пробел)
is_end_period = !!message.match(/\.\s*$/);
Нет орфографические ошибки.
ПРИМЕЧАНИЕ. Это, вероятно, сломается, потому что ваш словарь неполон, ваш текстовый корпус содержит дефисные слова, не содержит апострофов или токенизатор портит специальные символы или слова с числами.
dictionary = fs.readFileSync('dictionary.txt')
.toLowerCase()
.split('\n')
.reduce((store,x) => ({ ...store, [str]: true }), {})
;
message_tokens = [ ...message.toLowerCase().matchAll(/[a-z]([\w-']*\w)*/g) ]
.filter(match => !!match)
.map(match => match[0] )
;
// message_tokens = ["a", "test", "not", "what", "i", "wanted"]
is_spellchecked = message_tokens.every(token => !!dictionary[str])
Если вы серьезно относитесь к проверке орфографии, возможно, вы захотите исследовать конкретные c библиотеки проверки орфографии