我使用mudlet播放泥浆,并希望使用Perl正则表达式从我的提示中捕获一些输入。事情是,在我的搜索中没有过度重复似乎很难做到。我希望能够提出一个优雅的解决方案
以下是我的示例提示行:[NESWDNeSeSwNw] [The Palace Square-Bastion] [|Excl] >)|61|(<
我想要捕获的是每个方向以大写字母开头的方向列表,可能包含也可能不包含小写字母(仅限对角线)。有效的高位字母是N E S W U D(基数指示符),有效的小写字母仅为e w(对角线指示符)
我试图使用以下效果:^.([NESWUD]{1}[ew]?)+.
(与括号匹配的点,因为括号似乎无法在mudlet用于触发器的pcre中被转义)
此解决方案的问题在于它不捕获所有方向,而贪婪匹配仅匹配最后一个直接“Nw
”。如果我将其分解以删除捕获组并将贪婪移至[NESWUD]{1}[ew]?
,那么它不仅在我的提示中,而且还能让我知道所有大写字母的出现。
非常感谢任何帮助。
答案 0 :(得分:0)
([NUESWUD][ew]?)(?=[NSEWUDew\]])
这将从NESWDNeSeSwNw
[NESWDNeSeSwNw] [The Palace Square-Bastion] [|Excl] >)|61|(<
结束前瞻(?=[NSEWUDew\]])
确保其后面只有指定的字符,这意味着它不会捕获S
中的Square
或E
中的Excl
}。
尝试在此http://gskinner.com/RegExr/进行测试。
答案 1 :(得分:0)
我假设We
或Dw
这样的方向没有意义,e
和w
只能在N
之后或S
。你想要的是^\[((?:[EWUD]|[NS][ew]?)+)\]
。这将捕获$1
中的所有方向,而不仅仅是最后一个方向。
为了解释它我会使用更简单的正则表达式:((?:[a-z])+)
。 ([a-z])+
将匹配任何小写拉丁字母字符串,但每次捕获都会覆盖前一个字母,只保留最后一个字母(例如Hello
将返回o
)。 ((?:[a-z])+)
将匹配并捕获相同的字符串(例如,Hello
将在$ 1中返回ello
。 (?:[a-z])
阻止匹配被捕获,+
将匹配增加到尽可能多,然后外(
和)
将该字符串捕获到$1
您的正则表达式中不需要{1}
,因为这始终是隐含的。