每行匹配第一个单词和字符的正则表达式。

3

我将尝试编写一个正则表达式,以查找包含字符a的每行中的第一个单词。 对于以下字符串:

The cat ate the dog
and the mouse

该表达式应该找到猫和
迄今为止,我已经有了:

/\b\w*a\w*\b/g

然而,这将返回每行中的每个匹配项,而不仅仅是第一个匹配项(cat ate and)。
有什么最简单的方法只返回第一次出现的匹配项?

3个回答

2

假设您只需要单词而不包含数字和下划线(\w 包括这些),我建议您可以使用:

(?i)^.*?(?<!\S)([b-z]*a[a-z]*)(?!\S)

使用第一个捕获组中的任何内容。请参见在线演示。或者,如果支持:

(?i)^.*?\K(?<!\S)[b-z]*a[a-z]*(?!\S)

请查看在线演示

请注意,我使用了lookaround来断言该单词不在除空格字符之外的任何内容之间。如果您愿意,您也可以使用单词边界,并将那些lookaround替换为\b。此外,根据您的应用程序,您可能可以将内联不区分大小写开关更改为“标志”。例如,如果您使用JavaScript,则/^.*?(?<!\S)([b-z]*a[a-z]*)(?!\S)/gmi可能是您的选择。例如:

var myString = "The cat ate the dog\nand the mouse";
var myRegexp = new RegExp("^.*?(?<!\S)([b-z]*a[a-z]*)(?!\S)", "gmi");
m = myRegexp.exec(myString);
while (m != null) {
  console.log(m[1])
  m = myRegexp.exec(myString);
}


2
如果你想使用\w匹配一个单词,你也可以使用否定字符类来匹配除了a或换行符之外的任何字符。然后,使用单词边界\b来匹配至少包含一个a字符的单词。
^[^a\n\r]*\b([^\Wa]*a\w*)

该模式匹配:

  • ^ 字符串开头
  • [^a\n\r]*\b 可选地匹配除 a 或换行符外的任何字符
  • ( 捕获 第一组
    • [^\Wa]*a\w* 可选地匹配不包含 a 的单词字符,然后匹配 a 和可选的单词字符
  • ) 关闭第一组

正则表达式演示

在左右使用空白边界:

^[^a\n\r]*(?<!\S)([^\Wa]*a\w*)(?!\S)

Regex demo


不能将 ([^\Wa]*a\w*) 简化为 (\w*a\w*) 吗? - Cary Swoveland
@CarySwoveland 是的,那也会匹配。我使用了 ([^\Wa]*a\w*) 来防止在 a 字符上回溯 \w - The fourth bird
1
这听起来很熟悉。它的教育价值值得一提(现在已经实现了)。 - Cary Swoveland

2

这段文本可以与正则表达式匹配

(?=(\b[a-z]*a[a-z]*\b)).*\r?\n

启用多行和不区分大小写标志。对于每个匹配,捕获组1包含第一行中包含“a”的单词(仅由字母组成)。在不包含“a”的行中没有匹配项。

演示

该表达式可以分解如下。

(?=                # begin a positive lookahead
  \b               # match a word boundary
  ([a-z]*a[a-z]*)  # match a word containing an "a" and save to
                   # capture group 1
)
.*\r?\n            # match the remainder of the line including the
                   # line terminator 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接