正则表达式:子表达式?
Regex: Sub expressions?
我需要创建一个匹配这个表达式的正则表达式:
replace:sub\:str:new\:Substr
不过,我必须小心不要匹配其他看起来相似的字符串。例如,这是一个不同的匹配项:
slice:fromIndex[:toIndex]
具体来说:
- 字符串必须以
replace:
开头。如果不匹配,则不应匹配。
- 它必须匹配转义冒号:
\:
但不能匹配非转义冒号::
- 必须有两个匹配项(子字符串和新子字符串)。例如,在示例字符串中,正则表达式将匹配:
sub\:str
和 new\:Substr
.
- 重点是提取出子串,并替换为以后使用。该字符串将始终采用
replace:<subString>:<replacementString>
格式。但是,subString 和 replacementString 都可以转义冒号 :
,这就是示例包含它们的原因。
我一直想不出解决办法。虽然我不是正则表达式方面的专家,但我通常很能干。但到目前为止,我只能忽略 replace:
并简单地匹配 (?<=\:)(?:\:|[^:])+
以包含两个子字符串,但我最终也匹配了其他模式。如果我将 look behind 更改为 (?<=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
匹配:none
replace:UserName
匹配:none
slice:908:1098
匹配:none
这应该给你举个例子。作为背景,在解析此字符串后,它将用作另一个模板字符串的一种过滤器。
怎么样:
^replace:(\w+\:\w+):(\w+\:\w+)
第一组将包含 sub\:str
,第二组将包含 new\:Substr
根据 OP 编辑的新版本:
^replace:([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)
它适用于所有给定的测试用例
如果你不想replace
在整场比赛中,把它放在lookbehind:
(?<=^replace:)([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)
相当复杂,但您可以嵌套环视:
replace:(.+?(?!(?<=\):)):(.+(?!(?<=\):))
它将确保在 replace:
之后任何字符后面都不跟一个 :
而不是本身前面有一个 \
缺点:
如果有 3 个部分(第三个未转义 :
),第二部分将包含所有内容,请参阅演示了解我的意思。
匹配 C 字符串文字中所有转义序列的正则表达式如下所示
replace:([^:\]*(?:\.[^:\]*)*):([^:\]*(?:\.[^:\]*)*)
查看 regex demo
注意:如果它必须出现在字符串的开头,请在模式 staet 处添加 ^
。
详情:
replace:
- 文字字符序列
([^:\]*(?:\.[^:\]*)*)
- 捕获组 1 匹配
[^:\]*
- :
和 \
以外的 0+ 个字符
(?:\.[^:\]*)*
- 零个或多个序列:
\.
- 任何转义字符(\
和任何字符)
[^:\]*
- :
和 \
以外的 0+ 个字符
:
- 未转义的 :
([^:\]*(?:\.[^:\]*)*)
- 见上文。
我需要创建一个匹配这个表达式的正则表达式:
replace:sub\:str:new\:Substr
不过,我必须小心不要匹配其他看起来相似的字符串。例如,这是一个不同的匹配项:
slice:fromIndex[:toIndex]
具体来说:
- 字符串必须以
replace:
开头。如果不匹配,则不应匹配。 - 它必须匹配转义冒号:
\:
但不能匹配非转义冒号::
- 必须有两个匹配项(子字符串和新子字符串)。例如,在示例字符串中,正则表达式将匹配:
sub\:str
和new\:Substr
. - 重点是提取出子串,并替换为以后使用。该字符串将始终采用
replace:<subString>:<replacementString>
格式。但是,subString 和 replacementString 都可以转义冒号:
,这就是示例包含它们的原因。
我一直想不出解决办法。虽然我不是正则表达式方面的专家,但我通常很能干。但到目前为止,我只能忽略 replace:
并简单地匹配 (?<=\:)(?:\:|[^:])+
以包含两个子字符串,但我最终也匹配了其他模式。如果我将 look behind 更改为 (?<=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
匹配:nonereplace:UserName
匹配:noneslice:908:1098
匹配:none
这应该给你举个例子。作为背景,在解析此字符串后,它将用作另一个模板字符串的一种过滤器。
怎么样:
^replace:(\w+\:\w+):(\w+\:\w+)
第一组将包含 sub\:str
,第二组将包含 new\:Substr
根据 OP 编辑的新版本:
^replace:([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)
它适用于所有给定的测试用例
如果你不想replace
在整场比赛中,把它放在lookbehind:
(?<=^replace:)([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)
相当复杂,但您可以嵌套环视:
replace:(.+?(?!(?<=\):)):(.+(?!(?<=\):))
它将确保在 replace:
之后任何字符后面都不跟一个 :
而不是本身前面有一个 \
缺点:
如果有 3 个部分(第三个未转义 :
),第二部分将包含所有内容,请参阅演示了解我的意思。
匹配 C 字符串文字中所有转义序列的正则表达式如下所示
replace:([^:\]*(?:\.[^:\]*)*):([^:\]*(?:\.[^:\]*)*)
查看 regex demo
注意:如果它必须出现在字符串的开头,请在模式 staet 处添加 ^
。
详情:
replace:
- 文字字符序列([^:\]*(?:\.[^:\]*)*)
- 捕获组 1 匹配[^:\]*
-:
和\
以外的 0+ 个字符
(?:\.[^:\]*)*
- 零个或多个序列:\.
- 任何转义字符(\
和任何字符)[^:\]*
-:
和\
以外的 0+ 个字符
:
- 未转义的:
([^:\]*(?:\.[^:\]*)*)
- 见上文。