#javascript #regex
#javascript #регулярное выражение
Вопрос:
У меня есть этот сложный вопрос от моего клиента, я не могу найти на него ответ, поэтому теперь я попытаюсь задать его вам, ребята.
Задание заключается в следующем:
Я думаю, что одним из правил может быть: точки, которые появляются сразу после числа, не считаются предложениями. Это означает, что предложение, присутствующее в «8. marts» и «2.567», не считается точкой в слове. В свою очередь, точки в каждом слове могут быть пропущены (если теперь предложение заканчивается цифрой: «Vi kommer kl. 8»), но, вероятно, в конце концов, это происходит не так часто.
Другим может быть: если есть один символ (буква или цифра) сразу после предложения, это не фразеологическое предложение. Это позволило бы избежать подсчета предложений, присутствующих в «f.eks.», «bl.a.» и «cand.mag.».
Я надеюсь, что мне здесь помогут.
Мой код:
<script>
function word_count(field, count) {
var wordsNumberOverSeven = 0;
var wordsNumber = 0
var contentText = $('#lix_word_count').val();
contentText = contentText.replace('?', '.');
contentText = contentText.replace('!', '.');
contentText = contentText.replace(',', '');
contentText = contentText.replace(';', '');
contentText = contentText.replace(':', '');
contentText = contentText.replace('n', ' ').replace(/^s |s $/g,'').replace(/ss /g,' ');
var matchDots = contentText.split('.').length-1;
var match = contentText.split(' ');
$.each(match, function(){
if ( this.length > 0 )
wordsNumber = 1;
if ( this.length >= 7 )
{
wordsNumberOverSeven = 1;
}
});
var lixMatWords = wordsNumber / matchDots;
var lixMatLongWords = ( wordsNumberOverSeven * 100 ) / wordsNumber;
var lixMatch = Math.round(( lixMatWords lixMatLongWords ) *100)/100;
var lixType = '';
if ( lixMatch <= 24 )
lixType = 'Lixen i din tekst er ' lixMatch ', dvs. at teksten er meget let at læse.';
else if ( lixMatch <= 34 )
lixType = 'Lixen i din tekst er ' lixMatch ', dvs. at teksten er let at læse';
else if ( lixMatch <= 44 )
lixType = 'Lixen i din tekst er ' lixMatch ', dvs. at teksten ligger i midterområdet.';
else if ( lixMatch <= 54 )
lixType = 'Lixen i din tekst er ' lixMatch ', dvs. at teksten er svær at læse.';
else
lixType = 'Lixen i din tekst er ' lixMatch ', dvs. at teksten er meget svær at læse.';
/** alert(lixType 'nDots: ' matchDots 'nWords: ' wordsNumber 'nLangeord: ' wordsNumberOverSeven); **/
alert(lixType);
}
</script>
Комментарии:
1. Пожалуйста, перефразируйте вопрос, чтобы было ясно, что вам нужно. Кроме того, выберите заголовок получше; нет необходимости включать «javascript» и «regex» в заголовок, поскольку это теги, и этого достаточно.
2. Вам нужно переформулировать то, что вы пытаетесь сопоставить, а не то, как, по мнению вашего клиента, это должно быть сделано.
Ответ №1:
Я думаю, нам нужно ознакомиться с остальными правилами или, по крайней мере, с несколькими другими.
Возможно, было бы лучше описать то, что вы хотите включить в виде предложения, а не то, что исключить. Если вы ищете полные предложения, то это может быть точка, которой предшествует символ, не содержащий пробелов, за которым следует пробел, новая строка или перевод строки, или какой-либо более сложный набор правил. Для сортировки более сложных случаев может потребоваться более одного регулярного выражения с некоторой другой логикой.
Ответ №2:
Если вы хотите разделить предложения на основе этого правила, то что-то вроде
mySentences.match(/(?:[^.0-9]|[0-9] .?|.[a-z0-9]) (?:.|$)/ig)
должен это сделать.
Вам придется расширить, a-z
чтобы включить символы с ударением в вашем языке, но этого должно хватить.
Для вашего входного текста создается следующее.
["I think that one rule might be: Dots which appears immediately after a number, not counted as sentences.",
" This means that sentence present in the "8. marts"and "2.567" is not counted as word dots.",
" In return, each word dots may be overlooked (if now a sentence ends with a number: "Vi kommer kl.",
" 8") but it's probably after all not quite as often.",
"nnAnother might be: If there is one character (a letter or number) immediately after a sentence is not a phrase sentence.",
" That would make that we avoided counting the sentence present in the "f.eks.",
"", "bl.a.","" and "cand.mag.",
""."]
очевидно, что у него проблемы с точками, которые появляются внутри разделов, заключенных в кавычки. Вы могли бы исправить это, пройдя и присоединившись, пока предложение заканчивается внутри раздела, заключенного в кавычки.
// Given mySentences defined above, walk counting quote characters.
// You could modify the regexp below if your language tends to use
// a different quoting style, e.g. French-style angle quotes.
for (var i = 0; i < mySentences.length - 1; i) {
var quotes = mySentences[i].match(/["u201cu201d]/g);
// If there are an odd number of quotes, combine the next sentence
// into this one.
if (quotes amp;amp; quotes.length % 2) {
// In English, it is common to end the quoted section after the
// closing punctuator: Say "hello."
var next = mySentences[i 1];
if (/^["u201cu201d]/.test(next)) {
mySentences[i] = next.substring(0, 1);
mySentences[i 1] = next.substring(1);
} else {
mySentences[i] = next;
mySentences.splice(i, 1);
--i; // See if there's more to combine into this sentence.
}
}
}
Хотя такого рода материалы довольно хрупкие. Если вы хотите знать, как это делается людьми, специализирующимися на такого рода вещах, найдите «сегментация естественного языка».