2013-11-26 48 views
1

我需要從一個怪物,通過文本字符串來表示捕獲以下三件事情到變量,上一場比賽,我在一個正則表達式玩:我需要一個正則表達式進行條件匹配

  1. 怪物名稱(總是存在的。可能是一個或多個單詞,並可以包括括號)
  2. 健康(可選,總是包含在方括號[]如果有)
  3. 侵略(可選。總是顯示爲「攻擊你!」(如果存在) )

示例,後面跟着名稱/健康/侵略性匹配我希望下面各有:

示例1:[暴徒]水晶喬[受傷]攻擊你!

  • 名稱:晶喬
  • 健康:受傷
  • 攻擊:攻擊你!

例2:[mob] Crystal Joe。

  • 名:水晶喬
  • 健康狀況:(空白)
  • 侵略性:(空白)

實施例3:[暴民]水晶喬[劃傷。

  • 名稱:晶喬
  • 健康:劃傷
  • 侵略性:(空白)

例4:[怪物]喬攻擊你!

  • 名稱:喬
  • 健康:(空白)
  • 攻擊:攻擊你!

例5:[暴徒]巨大的紅龍攻擊你!

  • 名稱:一個巨大的紅龍
  • 健康:(空白)
  • 攻擊:攻擊你!

例子6:[mob]巨大的紅龍(閃閃發光)[垂死]攻擊你!

  • 名稱:一個巨大的紅龍(閃耀)
  • 健康:死亡
  • 攻擊:攻擊你!

我不是一個正規表達專家,老實說不熟練。我創建了下面的表達式:

\[mob\]\s([\w\s]*)(\[\w+\]\s?)?(attacking you)? 

上面似乎當所有三個都存在的工作,但是當健康(即「[抓傷]」缺少名稱的名稱和比賽「攻擊你!」正如其名字(即「喬攻擊你!」這不是我想要的。需要注意的是,上述表達並不試圖做例6用括號。

感謝您的幫助,您可以提供。

+0

創建多個正則表達式,並運行它們不只是1 ......這樣你就不必貧民窟砍多'|',然後不同的組名 – abc123

回答

1

你不是逃避方括號。試試看:

\[mob\]\s((?:(?!attacking you)[\w\s()])*)(?:\[(\w+)\]\s?)?(attacking you)? 

請參閱demo here(將鼠標放在線上以查看每個組匹配的內容)。

我做了什麼:

  • 躲過[];
  • 使用了一些括號(()),但添加了?:,因此它們不會成爲匹配組。
  • 使用前瞻(?!attacking you)來防止怪物名稱「吞嚥」該表情。
  • 幾乎所有的東西都保持不變。
+0

這美麗的工作。我很感謝這個答案,因爲你解釋了它的含義,你改變了什麼,並且包括一個演示例子。我在我的程序中試過,一切正常。謝謝! – user3034691