【问题标题】:Count the number of words in the line beginning with a particular word计算以特定单词开头的行中的单词数
【发布时间】:2016-11-16 05:41:47
【问题描述】:

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

【问题讨论】:

  • 你能把你的问题说得更清楚吗?你想从你提供的测试字符串中提取什么?
  • 你可以做string.split(' ').length
  • 您的脚本现在只是(尝试)匹配字符串,但不计算单词。匹配字符串所需的只是^\*AUY.*。这就是你要找的全部吗?你用什么代码counting字符串中的单词数?
  • 这个正则表达式有两个问题: (1) \b 匹配单词边界,但字符* 不是单词字符,所以它之前的边界不匹配; (2) 匹配星号,使用\*\\*匹配零个或多个反斜杠)

标签: javascript regex


【解决方案1】:

x 成为你的字符串。那么

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

将返回一个数组,其中包含以字符串“*AUY”开头的相应行中的类单词结构的数量。

解释:

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

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

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

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

【讨论】:

  • 感谢 Joesph,这很有帮助,但我想计算“*AUY:”之后的字符。现在它正在像这样在字符串中计数(“↵*AUY:突然她大喊并说灯泡烧坏了。”)对于给定的匹配返回 13。
  • @BilalHussain Lol,不客气!你所做的就是减去 1。return s.match(/\S+/g).length - 1.
【解决方案2】:

试试看:

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

Explanation

  1. ^ 在行首断言位置
  2. .*?匹配任何字符(行终止符除外)
  3. *?量词 - 零次和无限次之间的匹配(惰性)
  4. \* 匹配字符 *
  5. AUY:匹配字符AUY
  6. .*?匹配任何字符(行终止符除外)
  7. $ 在行尾断言位置
  8. g 修饰符:全局。第一场比赛后不返回
  9. m 修饰符:多行。导致 ^ 和 $ 匹配的开始/结束 每行(不仅是字符串的开头/结尾)
  10. i 修饰符:不敏感

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

    }

【讨论】:

  • Thanku Maverick,它起作用了。但是你能解释一下我如何遍历所有这些匹配的行并计算其中的单词吗?
  • @BilalHussain 你的问题应该更清楚了,现在我明白了你想计算 AUY 之后的字数:请注意我更新的示例代码
  • 非常感谢 Maverick,这正是我想要的 :)
【解决方案3】:

使用以下正则表达式,

(^.*\*AUY.*$)

你可以check it here

【讨论】:

    猜你喜欢
    • 2021-02-10
    • 2022-10-12
    • 2018-09-03
    • 2023-02-21
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 2014-01-02
    相关资源
    最近更新 更多