正则表达式:子表达式?

Regex: Sub expressions?

我需要创建一个匹配这个表达式的正则表达式:

replace:sub\:str:new\:Substr

不过,我必须小心不要匹配其他看起来相似的字符串。例如,这是一个不同的匹配项:

slice:fromIndex[:toIndex]

具体来说:

  1. 字符串必须以 replace: 开头。如果不匹配,则不应匹配。
  2. 它必须匹配转义冒号:\: 但不能匹配非转义冒号::
  3. 必须有两个匹配项(子字符串和新子字符串)。例如,在示例字符串中,正则表达式将匹配:sub\:strnew\:Substr.
  4. 重点是提取出子串,并替换为以后使用。该字符串将始终采用 replace:<subString>:<replacementString> 格式。但是,subString 和 replacementString 都可以转义冒号 :,这就是示例包含它们的原因。

我一直想不出解决办法。虽然我不是正则表达式方面的专家,但我通常很能干。但到目前为止,我只能忽略 replace: 并简单地匹配 (?<=\:)(?:\:|[^:])+ 以包含两个子字符串,但我最终也匹配了其他模式。如果我将 look behind 更改为 (?<=replace:) 我只匹配第一个子字符串。我只是不知道如何在不包含 : 分隔符的情况下让它也匹配第二个子字符串。我怀疑我需要以某种方式嵌套表达式,但我完全没有成功。

注意:我可以用语言解决这个问题。我可以简单地检查字符串是否具有前缀 replace: 作为单独的检查。但如果可能的话,我真的很想完全用 Regex 进行匹配。

更新(一些例子)

这应该给你举个例子。作为背景,在解析此字符串后,它将用作另一个模板字符串的一种过滤器。

怎么样:

^replace:(\w+\:\w+):(\w+\:\w+)

第一组将包含 sub\:str,第二组将包含 new\:Substr

根据 OP 编辑​​的新版本:

^replace:([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)

它适用于所有给定的测试用例

如果你不想replace在整场比赛中,把它放在lookbehind:

(?<=^replace:)([^:]+(?:\:)?[^:]+):([^:]+(?:\:)?[^:]+)

相当复杂,但您可以嵌套环视:

replace:(.+?(?!(?<=\):)):(.+(?!(?<=\):))

Demo

它将确保在 replace: 之后任何字符后面都不跟一个 : 而不是本身前面有一个 \

缺点:
如果有 3 个部分(第三个未转义 :),第二部分将包含所有内容,请参阅演示了解我的意思。

匹配 C 字符串文字中所有转义序列的正则表达式如下所示

replace:([^:\]*(?:\.[^:\]*)*):([^:\]*(?:\.[^:\]*)*)

查看 regex demo

注意:如果它必须出现在字符串的开头,请在模式 staet 处添加 ^

详情:

  • replace: - 文字字符序列
  • ([^:\]*(?:\.[^:\]*)*) - 捕获组 1 匹配
    • [^:\]* - :\
    • 以外的 0+ 个字符
    • (?:\.[^:\]*)* - 零个或多个序列:
      • \. - 任何转义字符(\ 和任何字符)
      • [^:\]* - :\
      • 以外的 0+ 个字符
  • : - 未转义的 :
  • ([^:\]*(?:\.[^:\]*)*) - 见上文。