我在groovy中寻找一个正则表达式,它将匹配所有这些,并且在这些示例中将有一个与指定部分匹配的组:
priority = "4-Not Prioritized Yet"
⇒群组: 4 - 尚未优先 priority != "4-Not Prioritized Yet"
⇒群组: 4 - 尚未优先 priority = High
⇒群组: 高 priority = "2-Medium"
⇒群组: 2-Medium priority changed
⇒无组 priority is EMPTY
⇒无组
我尝试了几种正则表达式:
/(?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;
}
答案 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 不会编辑文本 "到位"。替换的文本将作为此函数的结果返回 并且原始字符串不会更改。所以有必要保存 这个功能的结果。