我将尝试编写一个正则表达式,以查找包含字符a
的每行中的第一个单词。
对于以下字符串:
The cat ate the dog
and the mouse
该表达式应该找到
猫和
迄今为止,我已经有了:
/\b\w*a\w*\b/g
然而,这将返回每行中的每个匹配项,而不仅仅是第一个匹配项(cat ate and
)。
有什么最简单的方法只返回第一次出现的匹配项?
我将尝试编写一个正则表达式,以查找包含字符a
的每行中的第一个单词。
对于以下字符串:
The cat ate the dog
and the mouse
猫和
/\b\w*a\w*\b/g
然而,这将返回每行中的每个匹配项,而不仅仅是第一个匹配项(cat ate and
)。
有什么最简单的方法只返回第一次出现的匹配项?
假设您只需要单词而不包含数字和下划线(\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);
}
\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)
这段文本可以与正则表达式匹配
(?=(\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
([^\Wa]*a\w*)
简化为(\w*a\w*)
吗? - Cary Swoveland([^\Wa]*a\w*)
来防止在a
字符上回溯\w
。 - The fourth bird