Groovy正则表达式与组

时间:2017-08-04 16:30:12

标签: regex string groovy replace

我在groovy中寻找一个正则表达式,它将匹配所有这些,并且在这些示例中将有一个与指定部分匹配的组:

  1. priority = "4-Not Prioritized Yet" ⇒群组: 4 - 尚未优先
  2. priority != "4-Not Prioritized Yet" ⇒群组: 4 - 尚未优先
  3. priority = High ⇒群组:
  4. priority = "2-Medium" ⇒群组: 2-Medium
  5. priority changed ⇒无组
  6. priority is EMPTY ⇒无组

  7. 我尝试了几种正则表达式:

    • /(?i)priority\s*!?=\s*"?([^"]+)"?/
    • /(?i)priority[^\w]+([^"]+)"?/

    但是我无法找到适用于所有示例的模式。 所以我想知道我的正则表达式有什么问题,以及什么模式 将适用于所有的例子。

    我试图做的事情是这样的:

    def str = "{project = "TEST"} AND {priority = "4-Not Prioritized Yet"} OR {priority is EMPTY} OR {priority changed} OR {priority = "2-Medium"} OR {priority = "1-High"} OR {priority = "test"} order by priority DESC"
    str.replaceAll(/(?i)\{([^\}]+)\}/) {a, b-> 
        if(b.startsWith("priority")) {
            def regex = /(?i)priority([^\w]+)([^"]+)/
            def match = (b =~ regex);
            /* And now I would like to do something like:
               if (match has group) 
                   return b.replace(group, "something else")
               else return b */
        } else return b;
    }
    

1 个答案:

答案 0 :(得分:1)

您可以使用以下正则表达式:

priority (?:(changed|is EMPTY)|!?= ("?)([^"}]+)\2)

说明

  • priority - 匹配文字字符(常见的开头)。
  • (?: - 启动不匹配的群组。这是必要的,因为它包含 变体。
  • (changed|is EMPTY) - 变体1(第一个捕获组) - 捕获两者 要使用 No Group 替换的案例。
  • | - 变种分隔符。
  • !?= - 变体2的开头 - 匹配文字字符(可选!=)。
  • ("?) - 捕获第2组 - 抓住报价(如果有的话)。
  • ([^"}]+) - 捕获第3组 - 优先级值字符串。
  • \2 - 匹配第2组捕获的内容。
  • ) - 非捕获组的结束。

下面你有一个示例程序,打印原始和替换字符串:

def str = '{project = "TEST"} AND {priority = "4-Not Prioritized Yet"}\
 OR {priority is EMPTY} OR {priority changed} OR {priority = "2-Medium"}\
 OR {priority = "1-High"} OR {priority = "test"} order by priority DESC'
println str
def res = str.replaceAll(/priority (?:(changed|is EMPTY)|!?= ("?)([^"}]+)\2)/) {
  m, g1, g2, g3 ->
  if (g1?.trim()) {
    return "No Group"
  } else if (g3?.trim()) {
    return "Group: $g3"
  } else {
    return m
  }
}
println res

replaceAll 的闭包 - 参数有参数:

  • m - 整场比赛,
  • g1 ... g3 - 各捕获组捕获的内容。

如果第1组收到了某些内容,我们会收到 No Group 案例。

第2组捕获报价(如果有)。

如果第3组抓住了某个,我们有 Group ... case。

关于您的程序的一句话: replaceAll 不会编辑文本 "到位"。替换的文本将作为此函数的结果返回 并且原始字符串不会更改。所以有必要保存 这个功能的结果。