【问题标题】:I need a regular expression to do conditional matching我需要一个正则表达式来进行条件匹配
【发布时间】:2013-11-26 03:02:07
【问题描述】:

在我正在玩的游戏中,我需要用一个正则表达式将以下三件事从一个怪物中捕获到变量中,用一串文本表示:

  1. 怪物名称(始终存在。可能是一个或多个单词,并且可能包含括号)
  2. 健康(可选,如果有,请始终用括号 [] 括起来)
  3. 侵略(可选。总是显示为“攻击你!”如果存在)

示例,然后是我希望在每个下面的名称/健康/攻击匹配:

示例 1:[暴民] Crystal Joe [受伤] 攻击你!

  • 姓名:水晶乔
  • 健康:受伤
  • 侵略:攻击你!

示例 2:[暴民] 水晶乔。

  • 姓名:水晶乔
  • 健康状况:(空白)
  • 侵略:(空白)

示例 3:[暴民] Crystal Joe [划伤]。

  • 姓名:水晶乔
  • 健康:划伤
  • 侵略:(空白)

示例 4:[暴民] 乔攻击你!

  • 姓名:乔
  • 健康状况:(空白)
  • 侵略:攻击你!

示例 5:[mob] 一条巨大的红龙攻击你!

  • 名称:一条巨大的红龙
  • 健康状况:(空白)
  • 侵略:攻击你!

示例 6:[暴民] 一条巨大的红龙(闪闪发光)[垂死]攻击你!

  • 名称:一条巨大的红龙(闪闪发光)
  • 健康:垂死
  • 侵略:攻击你!

我不是正则表达式专家,老实说,我并不精通它。我创建了以下表达式:

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

以上似乎在所有三个都存在时有效,但是当健康(即“[scratched]”缺少名称时,名称与名称和“攻击你!”作为名称匹配(即“乔攻击你! " 这不是我想要的。请注意,上面的表达式并没有尝试使用括号来执行示例 6。

感谢您提供的任何帮助。

【问题讨论】:

  • 创建多个正则表达式,并运行它们而不仅仅是 1...这样您就不必使用多个 | 以及不同的组名来破解贫民窟

标签: regex regex-negation regex-lookarounds regex-greedy


【解决方案1】:

您没有转义方括号。试试这个:

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

请参阅demo here(将鼠标放在线条上以查看每个组匹配的内容)。

我做了什么:

  • 转义了[]
  • 使用了一些括号 (()),但添加了 ?:,因此它们不会是匹配组。
  • 使用前瞻 (?!attacking you) 来防止怪物名称“吞下”该表达式。
  • 几乎所有其他内容都保持不变。

【讨论】:

  • 这很好用。我很欣赏这个答案,因为您解释了它的含义,您所做的更改,并包含了一个演示示例。我在我的程序中尝试过,一切正常。谢谢!
猜你喜欢
  • 2010-09-23
  • 1970-01-01
  • 2011-09-22
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多