正则表达式不匹配它应该的第一个选择

Regex Not Matching The First Alternative It Should

我有一个用于清理帐户名称的正则表达式,在新的一年里我必须对其进行调整以捕获另一个团队正在使用的帐户名称的新版本。但是,我很难理解为什么简单地添加另一种选择是行不通的。

这是我正在使用的:

^.*\b((?i)foxtrot movie|whiskey|whiskeyfoxtrotmovie)\b.*$

这对于数据中的其他版本的帐户名非常有效,主要是 "Foxtrot Movie"。但现在我希望它捕获 "Whiskey Foxtrot Movie" 和 "Foxtrot Movie".

为澄清起见,两者都在此正则表达式所经过的列中。当其中任何一个出现时,我希望捕获整个字符串。我从不希望 "Whiskey" 不被捕获,并且 "Whiskey Foxtrot Movie" 和 "Foxtrot Movie" 是一堆其他帐户名称中的不同行。

我知道 Regex 很急切,所以为了鼓励首先匹配较大的字符串,我将边界内的表达式调整为 \b((?i)whiskeyfoxtrotmovie|whiskey foxtrot movie|whiskey|foxtrot movie)\b,但即使对于较长的字符串,它也只捕获 "Foxtrot Movie"。我不明白为什么它与捕获 "Whiskey Foxtrot Movie"

的第二种选择不匹配

(whiskey)? foxtrot movie 导致相同的错误。 移动订单似乎也无济于事。在 () 中包含每个备选方案也让我失望。

我在这方面还是个新手,所以也许我对边界有一些不了解的地方?但只要我没有同时在表达式中使用 whiskey foxtrot moviefoxtrot movie,这就可以工作。也许空格?

欢迎任何见解。

问题出在第一个贪婪 .* 中,当最左边的文本大部分已经被第一个 .* 抓取时,将尝试替代方案。

如果必须匹配整个字符串,请将第一个 .* 替换为 .*?,但使用允许部分匹配的方法并仅使用

更有意义
(?i)\b(whiskeyfoxtrotmovie|whiskey foxtrot movie|whiskey|foxtrot movie)\b

regex demo

也就是说,删除 ^$ 锚点以及封闭的 .* 模式。