优雅的正则表达式在一条线上的有限空间内匹配

时间:2013-11-14 10:26:14

标签: regex lua pcre prompt

我使用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]?,那么它不仅在我的提示中,而且还能让我知道所有大写字母的出现。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

([NUESWUD][ew]?)(?=[NSEWUDew\]])

这将从NESWDNeSeSwNw

中捕获[NESWDNeSeSwNw] [The Palace Square-Bastion] [|Excl] >)|61|(<

结束前瞻(?=[NSEWUDew\]])确保其后面只有指定的字符,这意味着它不会捕获S中的SquareE中的Excl }。

尝试在此http://gskinner.com/RegExr/进行测试。

答案 1 :(得分:0)

我假设WeDw这样的方向没有意义,ew只能在N之后或S。你想要的是^\[((?:[EWUD]|[NS][ew]?)+)\]。这将捕获$1中的所有方向,而不仅仅是最后一个方向。

为了解释它我会使用更简单的正则表达式:((?:[a-z])+)([a-z])+将匹配任何小写拉丁字母字符串,但每次捕获都会覆盖前一个字母,只保留最后一个字母(例如Hello将返回o)。 ((?:[a-z])+)将匹配并捕获相同的字符串(例如,Hello将在$ 1中返回ello(?:[a-z])阻止匹配被捕获,+将匹配增加到尽可能多,然后外()将该字符串捕获到$1

您的正则表达式中不需要{1},因为这始终是隐含的。