2014-10-19 27 views
0

在我玩的MUD上,暴徒房間的描述可以在許多變化中開始。我試圖寫一個正則表達式,它只捕獲暴民的房間描述,而不是任何可能的開始標誌。這是我到目前爲止:完善一個正則表達式模式

^\((?:[ACDGHIXRSTUW()]+|\s?\(Angry\))\)?\s?(.*)$ 

它的工作,大部分,直到暴民沒有起始國旗。以下是我正在談論的有關變體的示例:

(H) (Angry) A mob is here. 
(A)(W)(R) A mob is also here. 
Another mob is here. 

這只是暴民可能出現的三種不同方式。基本上,範圍部分中的每個字母都可以是一個標誌,由()包圍。在單個字母標誌之間沒有空格)和下一個(但是,在(憤怒)之前有一個空格,除非它是領先的)。

我的問題是它沒有捕獲最後一個怪物,它捕獲「(憤怒)」,我認爲我總體上對正則表達式有一個公平的把握,但我不明白我做錯了什麼,甚至可能不是最有效的處理方式。

編輯:如果不清楚,我只想捕獲最後的所有內容),或者如果沒有標記則從頭開始。

回答

2

這是行嗎?

^(?:.*\))?(.*) 
+0

它會更好,如果你的命令是'^(?:* \))(?。 *)' – 2014-10-19 02:06:47

+0

其實,我原本是用hwnd的答案去的,但是發現Avinash Raj的版本(做了一些小改動)才能更好地工作!再次感謝! – Josh 2014-10-19 02:22:31

+0

@AvinashRaj好點。謝謝。 – 2014-10-19 12:26:24

1

您可以使用以下正則表達式。

^(?>.*\))?\s*(.*) 
+0

你的工作,它似乎並不喜歡新的$停止它,所以它流血到下一行。不知道是什麼原因造成的,但這對我未來的正則表達式也有幫助! – Josh 2014-10-19 02:27:41

+0

嗯不知道爲什麼,http://regex101.com/r/mR5uM3/2 – hwnd 2014-10-19 02:29:10

1

或使用這種模式
\s*([^)]+$)或在多行輸入\s*([^)\r\n]+$)
Demo

\s*      whitespace (0 or more times) 
(      group capture 
    [^)]+     any character except: ')' (1 or more times) 
    $      before an optional \n, and the end of the string 
)      end of group