繁体   English   中英

RegExp 捕获不匹配

[英]RegExp capturing non-match

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

go north go foo north

以下不匹配:

foo go

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

我该如何纠正?

尝试使用正向后视功能来查找单词“go”。

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

请注意,此解决方案会阻止您在正则表达式的开头包含^ ,因为文本“go”实际上并未包含在该组中。

您必须将右括号移到模式的末尾才能在锚点之间拥有两个模式,否则您将允许在主要方向之一之前进行匹配,并且它仍然会在字符串的末尾捕获主要方向。

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

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

正则表达式演示

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

在这种情况下,你可以匹配行的其余部分,主张go在字符串的开始向左,或只匹配基本方向的1:

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

正则表达式演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM