正则表达式:子表达式?

时间:2017-02-07 16:02:50

标签: regex nsregularexpression

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

replace:sub\:str:new\:Substr

我必须小心不要匹配其他类似的字符串。例如,这是一个不同的匹配:

slice:fromIndex[:toIndex]

具体做法是:

  1. 该字符串必须以replace:开头。如果没有,那么什么都不匹配。
  2. 必须与转义的冒号相匹配:\:但不是未转义的冒号::
  3. 必须有两个匹配项(子字符串和新子字符串)。例如,在示例字符串中,正则表达式匹配:sub\:strnew\:Substr
  4. 重点是提取子字符串并将其替换以供日后使用。该字符串将始终采用replace:<subString>:<replacementString>格式。但是,subString和replacementString都可以转义冒号:,这就是示例包含它们的原因。
  5. 我一直无法提出解决方案。虽然我不是Regex的专家,但我通常都很称职。但到目前为止,我只能忽略replace:并简单地匹配(?<=\:)(?:\\:|[^:])+以包含两个子字符串,但我最终也匹配其他模式。如果我将后面的内容更改为(?<=replace:),我只匹配第一个子字符串。我无法弄清楚如何在不包含:分隔符的情况下使其与第二个子字符串匹配。我怀疑我需要以某种方式嵌套表达,但我完全没有成功。

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

    更新(某些示例)

    • replace:sub\:str:new\:Substr匹配:sub\:strnew\:Substr
    • replace:subString:replacment匹配:subStringreplacement
    • replace:UserId:user\:ID匹配:UserIduser:ID
    • replace:UserName:Aaron Hayman匹配:UserNameAaron Hayman
    • replace:userId:uid90809y087匹配:userIduid90809y087

    • rep:userId:user匹配:无

    • replace:UserName匹配:无
    • slice:908:1098匹配:无

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

3 个答案:

答案 0 :(得分:1)

将匹配C字符串文字中可能包含的所有转义序列的正则表达式将类似于

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

请参阅regex demo

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

<强>详情:

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

答案 1 :(得分:0)

怎么样:

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

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

根据OP编辑的新版本:

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

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

如果您不想在整个比赛中使用replace,请将其置于lookbehind:

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

答案 2 :(得分:0)

相当令人费解,但你可以嵌套:

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

Demo

这将确保replace:后任何字符后面没有:本身后面跟\

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