Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式不匹配它应该使用的第一个选项_Regex_Regex Group - Fatal编程技术网

Regex 正则表达式不匹配它应该使用的第一个选项

Regex 正则表达式不匹配它应该使用的第一个选项,regex,regex-group,Regex,Regex Group,我有一个用于清理帐户名的正则表达式,在新的一年里,我必须调整它以捕获另一个团队正在使用的帐户名的新版本。然而,我很难理解为什么简单地添加另一个替代方案是行不通的 以下是我正在使用的: ^.*\b((?i)狐步舞电影|威士忌|威士忌狐步舞)\b.*$ 这对于数据中帐户名的其他版本非常有效,主要是“Foxtrot电影”。但现在我想让它捕捉“威士忌狐步舞电影”和“狐步舞电影” 为了澄清,这两个都在这个正则表达式所经过的列中。我希望在其中一个出现时捕获整个字符串。我从来都不希望“威士忌”不被抓取,“威士

我有一个用于清理帐户名的正则表达式,在新的一年里,我必须调整它以捕获另一个团队正在使用的帐户名的新版本。然而,我很难理解为什么简单地添加另一个替代方案是行不通的

以下是我正在使用的:

^.*\b((?i)狐步舞电影|威士忌|威士忌狐步舞)\b.*$

这对于数据中帐户名的其他版本非常有效,主要是“Foxtrot电影”。但现在我想让它捕捉“威士忌狐步舞电影”和“狐步舞电影”

为了澄清,这两个都在这个正则表达式所经过的列中。我希望在其中一个出现时捕获整个字符串。我从来都不希望“威士忌”不被抓取,“威士忌狐步舞电影”和“狐步舞电影”是其他账户名称中不同的一行

我知道Regex很热心,所以为了鼓励首先匹配较大的字符串,我将边界内的表达式调整为
\b((?i)威士忌狐步舞|威士忌狐步舞电影|威士忌狐步舞电影)\b
,但它只捕获“狐步舞电影”,即使是更长的字符串。我不明白为什么它与拍摄《威士忌狐步舞电影》的第二个选择不匹配

(威士忌)?狐步舞电影
会导致相同的错误。 移动订单似乎也无济于事。将每个备选方案封装在
()
中也使我失败

我在这方面还是新手,所以也许我对边界有些不了解?但只要表达式中没有同时包含
威士忌狐步舞电影
狐步舞电影
,这就行了。也许是空间


欢迎任何见解。

问题出在第一个
*
中,当第一个
*
已经抓取了最左边的大部分文本时,就会尝试其他方法

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

(?i)\b(whiskeyfoxtrotmovie|whiskey foxtrot movie|whiskey|foxtrot movie)\b


也就是说,删除
^
$
锚定和包围的
*
模式。

只需使用
(?i)\b(威士忌狐步舞电影|威士忌狐步舞电影|威士忌狐步舞电影)\b
。不要使用
*
和锚点。如果必须匹配整个字符串,请将第一个
*
替换为
*?
。显示失败的代码。@WiktorStribiżew谢谢!卸下锚起了作用。就我个人所知,它们在我的原始代码中不是问题的原因是什么,但我想在哪里添加新的替代方案?我知道您的问题出在第一个贪婪的
*
,在第一个
*
已经抓取了最左边的大部分文本时尝试了替代方案。所以,
(?i)\b(威士忌狐步舞电影|威士忌狐步舞电影|威士忌狐步舞电影)\b
本身应该可以工作。