首页 > 解决方案 > 正则表达式捕获不匹配

问题描述

我有一个游戏的正则表达式,它应该以go [anything]or的形式匹配字符串[cardinal direction],并捕获 the[anything][cardinal direction]. 例如,以下将匹配:

go north go foo north

以下内容不匹配:

foo go

我能够使用两个单独的正则表达式来做到这一点:/^(?:go (.+))$/匹配第一种情况,并/^(north|east|south|west)$/匹配第二种情况。我试图将正则表达式组合为/^(?:go (.+))|(north|east|south|west)$/. 正则表达式正确匹配我所有的测试用例,但它没有正确捕获第二种情况。我尝试将正则表达式插入 RegExr 并注意到即使第一个案例没有被匹配,它仍然被捕获。

我该如何纠正?

标签: javascriptregexregex-group

解决方案


您必须将右括号移到模式的末尾以使两个模式都位于锚点之间,否则您将允许在一个基本方向之前进行匹配,并且它仍会捕获字符串末尾的基本方向。

然后在 JavaScript 中,您可以检查第 1 组或第 2 组的值。

^(?:go (.+)|(north|east|south|west))$
                                   ^  

正则表达式演示

使用后向断言(如果支持),您也可能只获得匹配而不是捕获组。

在这种情况下,您可以匹配该行的其余部分,go 在字符串开头的左侧断言,或者仅匹配一个基本方向:

(?<=^go ).+|^(?:north|east|south|west)$

正则表达式演示


推荐阅读