2016-11-16 72 views
0

我想要计算包含特定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

+1

你能让你的问题更清楚吗?你想从你提供的测试字符串中提取什么? – MYGz

+0

你可以'string.split('').length' – Rajesh

+0

你的脚本现在只是(尝试)匹配字符串,但不包括单词。所有你需要匹配的字符串是'^ \ * AUY。*'。这是你要找的所有东西吗?你试过什么代码*计数*字符串中的单词数量? –

回答

2

试一下:

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

Explanation

  1. ^断言位置的直线
  2. 的开始。*?匹配任何字符(线路终结符除外)
  3. *?量词 - 零和无限次(偷懒)之间的较量
  4. \ *匹配字符*
  5. AUY:人物AUY
  6. *匹配?匹配任何字符(线路终结符除外)
  7. $ asserts在行尾的位置
  8. g修饰符:全局。第一场比赛后不返回
  9. 米修改:多行。原因^和$到 每行的开始/结束匹配(不只是开头的字符串/结束)
  10. 我修改:敏感

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); 
} 

    } 
+0

Thanku特立独行,它的工作。但可以请你解释我是如何通过这些匹配线环和算的话在里面 ? –

+0

@BilalHussain你的问题本来应该更清晰,现在我已经明白,要算话的AUY后的数字:请注意我更新的示例代码 –

+0

Thanku洙多特立独行的,这是什么,我正好在寻找:) –

0

使用以下正则表达式,

(^.*\*AUY.*$) 

你可以check it here

3

x是你的字符串。然后

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

将返回以字符串'* AUY'开头的相应行内的字数结构数的数组。

说明:

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

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

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

您可以使用此代码作为出发点,做你真正想做的事工作。祝你好运!

+0

Thanku Joesph对我有很大的帮助,但是我想在“* AUY:”之后数字。现在,它正在像这样的字符串中计数(“↵* AUY:\t突然她大叫,并说灯泡燃烧了。”),并返回13给定的比赛。 –

+0

@BilalHussain哈哈,不客气!你所做的只是减去1.'return s.match(/ \ S +/g).length - 1'。 –