справка по регулярным выражениям javascript

#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.
    }
  }
}
  

Хотя такого рода материалы довольно хрупкие. Если вы хотите знать, как это делается людьми, специализирующимися на такого рода вещах, найдите «сегментация естественного языка».