簡體   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