【发布时间】:2017-02-07 16:02:49
【问题描述】:
我需要创建一个匹配这个表达式的正则表达式:
replace:sub\:str:new\:Substr
不过,我必须小心不要匹配其他看起来相似的字符串。例如,这是一个不同的匹配:
slice:fromIndex[:toIndex]
具体来说:
- 字符串必须以
replace:开头。如果不匹配,则不匹配。 - 它必须匹配转义冒号:
\:,但不能匹配非转义冒号:: - 必须有两个匹配项(子字符串和新子字符串)。例如,在示例字符串中,正则表达式将匹配:
sub\:str和new\:Substr。 - 关键是要提取子字符串并替换它以供以后使用。该字符串将始终采用
replace:<subString>:<replacementString>格式。但是,subString 和 replacementString 都可以有转义冒号:,这就是示例包含它们的原因。
我一直无法提出解决方案。虽然我不是 Regex 方面的专家,但我通常很能干。但到目前为止,我只能忽略replace: 并简单地匹配(?<=\:)(?:\\:|[^:])+ 以包含两个子字符串,但我最终也匹配了其他模式。如果我将后面的外观更改为 (?<=replace:) 我只匹配第一个子字符串。我只是不知道如何在不包含: 分隔符的情况下让它也匹配第二个子字符串。我怀疑我需要以某种方式嵌套表达式,但我完全没有成功。
注意:我可以用语言解决这个问题。我可以简单地检查字符串是否具有前缀 replace: 作为单独的检查。但如果可能的话,我真的很想完全在 Regex 中完成比赛。
更新(一些例子)
-
replace:sub\:str:new\:Substr匹配:sub\:str、new\:Substr -
replace:subString:replacment匹配:subString、replacement -
replace:UserId:user\:ID匹配:UserId、user:ID -
replace:UserName:Aaron Hayman匹配:UserName、Aaron Hayman replace:userId:uid90809y087匹配:userId、uid90809y087rep:userId:user匹配:无-
replace:UserName匹配:无 -
slice:908:1098匹配:无
这应该给你一个例子。作为背景,在这个字符串被解析之后,它将被应用为另一个模板字符串的一种过滤器。
【问题讨论】:
-
整个
sub\:str是一个中间有东西的子字符串,还是sub\:(和new\:)部分也是静态的?我的意思是,replace:sub\\:(.+):new\\:(.+)会起作用吗? -
第 3 点不太清楚。你能展示你想要什么吗?是
sub\:str和new\:Substr还是别的什么? -
输入和输出示例?
-
@Toto 我已经澄清了问题并添加了输出应该是什么。