【发布时间】:2020-01-03 04:34:07
【问题描述】:
我对 Javascript 的 .match 正则表达式函数感到困惑。
给定字符串:
var a = "today, I will ski with skis";
我想匹配“today”、“ski”和“skis”
a.match(/hello|today|skis|trip|ski/g);
输出:["today", "ski", "skis"]
输出符合我的预期。
但是,如果我在查找中将“ski”放在“skis”之前,对于“ski”和“skis”匹配,它会在“ski”处停止:
a.match(/hello|today|ski|trip|skis/g);
输出:["today", "ski", "ski"]
为什么它不会同时返回“ski”和“skis”,我该如何解决?
编辑:澄清一下,我正在寻找一种动态解决方案,以便在已经识别出第一组字符后继续搜索列表。我的目标是动态填充搜索词列表,我无法确定将 ? 应用于哪些字符。
即,对skis? 使用? 运算符不是动态的,因为我必须为每个可能的字符手动添加它。如果“skittles”或“ski mountain”出现在“ski”之后,这些都将被match 忽略。 ski(.*) 越来越近,但它在其边界 | 组之后返回所有内容。
【问题讨论】:
-
如果你问为什么它不返回输入中最后一个“skis”的“ski”和“skis”,那是因为它们是重叠匹配
-
有很多字符串是其他单词的前缀或子字符串。
var a = "today, I will ski with skittles";--->a.match(/hello|today|ski|trip|skittles/g);返回["today", "ski", "ski"]。函数真的是这样工作的吗? -
是的正则表达式是贪婪的,一旦找到匹配项,它将继续其余的而不评估您的
(...|...|...)中的其他选项 -
感谢@Emma,这很清楚。当
.match在第一个匹配时停止时,使用?运算符动态创建搜索词列表有点棘手(特别是在单词的情况下,例如“skittles”,在它包含之前有搜索词,例如“滑雪”)。
标签: javascript regex match