我需要一个正则表达式来进行条件匹配

时间:2013-11-26 03:02:07

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

我需要将以下三个内容捕获到一个怪物的变量中,由一串文字表示,我正在一个正则表达式中播放:

  1. 怪物名称(总是在那里。可能是一个或多个单词,可能包含括号)
  2. 健康(可选,如果有的话,总是括在括号[]中)
  3. 侵略(可选。总是显示为“攻击你!”如果存在)
  4. 示例,接下来是我想要的名称/健康/进攻匹配:

    示例1:[暴徒]水晶乔[受伤]攻击你!

    • 姓名:Crystal Joe
    • 健康:受伤
    • 侵略:攻击你!

    示例2:[mob] Crystal Joe。

    • 姓名:Crystal Joe
    • 健康:(空白)
    • 侵略:(空白)

    示例3:[mob] Crystal Joe [划伤]。

    • 姓名:Crystal Joe
    • 健康:划伤
    • 侵略:(空白)

    例4:[暴徒]乔攻击你!

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

    示例5:[暴徒]一条巨型红龙攻击你!

    • 姓名:巨型红龙
    • 健康:(空白)
    • 侵略:攻击你!

    例6:[暴徒]一条巨型红龙(闪闪发光)[垂死]攻击你!

    • 姓名:巨型红龙(闪闪发光)
    • 健康:垂死
    • 侵略:攻击你!

    我不是正规表达专家,老实说也不是很精通。我创建了以下表达式:

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

    当所有三个都存在时,上述似乎都有效,但是当健康状况(即“[划痕]”缺失时,名称与名称和“攻击你!”同名作为名称(即“Joe攻击你! “这不是我想要的。请注意,上面的表达式并不试图用括号做实例6。

    感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

你没有逃避方括号。试一试:

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

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

我做了什么:

  • 转发[];
  • 使用了一些括号(()),但添加了?:,因此它们不会是匹配的组。
  • 使用前瞻(?!attacking you)来防止怪物名称“吞噬”该表达。
  • 其他一切都保持不变。