计算以特定单词开头的行中的单词数

时间:2016-11-16 05:41:48

标签: javascript regex

我想计算特定行中包含特定ID(例如* AUY)的单词数。到目前为止,我已尝试使用以下正则表达式来查找该行,但它在开始时不考虑“*”

^ *(.*\b(?:\\*AUY)\b.*) *$

我有以下测试字符串

*AUY:   today is holiday so Peter and Mary do not need to go to work .
%mor:   n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work .
%snd:   <00:00:00><00:07:37>
%AUY:   ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a |

结果应该只是第一个字符串,但它返回结果匹配的第一个和最后一个字符串。 见Rubular

3 个答案:

答案 0 :(得分:3)

x成为你的字符串。然后

(x.match(/(^|\n)\*AUY[^\r\n]*/g) || [])
    .map(
        function(s) { return s.match(/\S+/g).length; }
    );

将返回以字符串&#39; * AUY&#39;开头的相应行中的多个类似字的构造的数组。

说明:

正则表达式在字符串的开头查找字符串* AUY,或者直接在任何换行符之后(即,在行的开头,即使该行不在字符串的开头),以及任何换行符在* AUY的第一个标记之后的非CRLF字符(即该行的其余部分)。

执行匹配后的惯用语|| []如果匹配值为null,将返回一个空数组,从而防止在预期数组而不是空值时出错。

最后一步.map对匹配数组的每个元素进行操作,并计算非空白匹配,并将这些计数作为新数组返回。请注意,我们不需要使用|| []惯用法保护此匹配项,因为无法进行空匹配,因为该行至少包含非空白字符串* AUY。

您可以使用此代码作为起点来执行您真正想要做的事情。祝你好运!

答案 1 :(得分:2)

试试:

/^.*?\*AUY:(.*?)$/gmi

Explanation

  1. ^断言行开头的位置
  2. 。*?匹配任何字符(行终止符除外)
  3. *?量词 - 零和无限时间之间的匹配(懒惰)
  4. \ *匹配字符*
  5. AUY:匹配字符AUY
  6. 。*?匹配任何字符(行终止符除外)
  7. $断言行尾的位置
  8. g modifier:global。第一场比赛后不要回来
  9. m修饰符:多行。导致^和$匹配开头/结尾 每一行(不仅是字符串的开头/结尾)
  10. i modifier:insensitive
  11. Rubular

    代码示例:

    function countWord(){
    
    const regex = /^.*?\*AUY:(.*?)$/gmi;
    const str = `*AUY:  today is holiday so Peter and Mary do not need to go to work .
    %mor:   n|today cop|be&3s n|holiday conj|so n:prop|Peter conj|and n:prop|Mary v|do neg|not v|need inf|to v|go prep|to n|work .
    %snd:   <00:00:00><00:07:37>
    %AUY:   ok_pfp (0.40) er today is holiday errfr ::: so er Peter and Mary {is} ~ er do not need errfr ::: to go to work . errfr :;:a |`;
    let m;
    
    while ((m = regex.exec(str)) !== null) {
        // This is necessary to avoid infinite loops with zero-width matches
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }
        alert(m[1].match(/\b(\w+)\b/g).length);
    }
    
        }
    

答案 2 :(得分:0)

使用以下正则表达式

(^.*\*AUY.*$)

你可以check it here