我需要创建一个与此表达式匹配的正则表达式:
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
,uid90809y087
rep:userId:user
匹配:无
replace:UserName
匹配:无slice:908:1098
匹配:无这应该给你一个例子。作为背景,在解析此字符串之后,它将作为另一种模板字符串的过滤器应用。
答案 0 :(得分:1)
将匹配C字符串文字中可能包含的所有转义序列的正则表达式将类似于
replace:([^:\\]*(?:\\.[^:\\]*)*):([^:\\]*(?:\\.[^:\\]*)*)
请参阅regex demo
注意:如果它必须出现在字符串的开头,请在模式staet处添加^
。
<强>详情:
replace:
- 文字字符序列([^:\\]*(?:\\.[^:\\]*)*)
- 捕获第1组匹配
[^:\\]*
- 除:
和\
(?:\\.[^:\\]*)*
- 零个或多个序列:
\\.
- 任何转义的字符(\
和任何字符)[^:\\]*
- 除:
和\
:
- 未转义的:
([^:\\]*(?:\\.[^:\\]*)*)
- 见上文。答案 1 :(得分:0)
怎么样:
^replace:(\w+\\:\w+):(\w+\\:\w+)
第一组将包含sub\:str
,第二组将包含new\:Substr
根据OP编辑的新版本:
^replace:([^:]+(?:\\:)?[^:]+):([^:]+(?:\\:)?[^:]+)
适用于所有给定的测试用例
如果您不想在整个比赛中使用replace
,请将其置于lookbehind:
(?<=^replace:)([^:]+(?:\\:)?[^:]+):([^:]+(?:\\:)?[^:]+)
答案 2 :(得分:0)
相当令人费解,但你可以嵌套:
replace:(.+?(?!(?<=\\):)):(.+(?!(?<=\\):))
这将确保replace:
后任何字符后面没有:
本身后面跟\
<强>缺点:强>
如果有3个部分(第三部分没有转义:
),第二部分将包含所有内容,请参阅演示,了解我的意思。