我想计算特定行中包含特定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
答案 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
代码示例:
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)