2013-11-14 24 views
0

我使用mudlet玩泥,並希望使用Perl正則表達式從我的提示中捕獲一些輸入。事情似乎很難做,沒有在我的搜索過度重複。我希望能想出一個優雅的解決優雅的正則表達式在單行上的有限空間內匹配

這裏是我的示例提示行:[NESWDNeSeSwNw] [The Palace Square-Bastion] [|Excl] >)|61|(<

我想捕捉的方向的列表,其中每個方向有一個大寫字母開始,可能會或可能不包含小寫字母(僅限對角線)。有效的大寫字母是NESWUD(主要指標),有效的小寫字母只是ew(對角線指標)

我試圖使用以下內容:^.([NESWUD]{1}[ew]?)+.(點符合括號,因爲括號似乎無法被mudrif用於觸發器的pcre中逃脫)

該解決方案的問題在於它沒有捕獲所有的方向,貪婪的匹配只匹配最後一個directon「Nw」。如果我把它分解出來,將捕獲組和貪婪移除到[NESWUD]{1}[ew]?,它就會讓我在任何地方發現大寫字母的每一個字符,而不僅僅是在我的提示中。

任何幫助將不勝感激。

+2

爲什麼這個標籤用'lua'雖然呢?基於lua的解決方案也可以接受嗎? – greatwolf

+0

您可以使用\來取消Mudlet中的括號。 Mudlet使用PCRE([manual](http://www.pcre.org/pcre.txt))進行正則表達式匹配。 一個基於Lua的解決方案也是可以接受的,因爲Mudlets觸發器允許運行Lua代碼來匹配 - 所以返回「true」的任何東西都將被視爲匹配。 – Vadi

回答

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

這將捕獲NESWDNeSeSwNw[NESWDNeSeSwNw] [The Palace Square-Bastion] [|Excl] >)|61|(<

年底向前看(?=[NSEWUDew\]])確保其僅次於指定的字符意味着它認爲這不會捕捉SquareSExclE

試着在這裏測試這個http://gskinner.com/RegExr/

0

我假設像WeDw方向是沒有意義的,並且ew只能來自NS之後。你想要的就像^\[((?:[EWUD]|[NS][ew]?)+)\]。這將捕獲$1中的所有方向,而不僅僅是最後一個方向。

爲了解釋它,我將使用更簡單的正則表達式:((?:[a-z])+)([a-z])+將匹配任何小寫拉丁字母字符串,但每個捕獲將覆蓋前一個,只保留最後一個字母(例如Hello將返回o)。 ((?:[a-z])+)將匹配並捕獲相同的字符串(例如,Hello將以$ 1返回ello)。 (?:[a-z])防止匹配被捕獲,+將匹配增加到儘可能多,並且外部()然後將該字符串捕獲到$1

您在正則表達式中並不需要{1},因爲這總是隱含的。