【问题标题】:Regex to replace all curly braces except for the case '{0}'正则表达式替换除大小写“{0}”之外的所有花括号
【发布时间】:2020-02-05 12:08:15
【问题描述】:

我想验证一个字符串:

  • 它可能包含零到多次出现的{0}
  • 必须删除所有其他出现的 { 或 }。

所以:'AbC{de{0} x{1}}' 必须变为 'AbCde{0} x1'

我试过这个:

value = Regex.Replace(value, @"({|})+(?!{0})", string.Empty);

但这给了我错误:

正则表达式问题:量词(x,y) 什么都没有。

怎么了?

【问题讨论】:

    标签: c# regex regexp-replace


    【解决方案1】:

    你可以使用

    Regex.Replace(text, @"(\{0})|[{}]", "$1")
    

    或者,支持{...}中的任何ASCII数字,

    Regex.Replace(text, @"(\{[0-9]+})|[{}]", "$1")
    

    regex demo

    详情

    • (\{0}) - 捕获组 1($1 指替换字符串中的此值):{0} 子字符串
    • | - 或
    • [{}] - {}

    另一种环视方法是可能的:

    Regex.Replace(text, @"{(?!0})|(?<!{0)}", string.Empty)
    

    another regex demo。这里,{(?!0}) 匹配 { 后面没有 0}(?&lt;!{0)} 匹配 } 前面没有 {0

    【讨论】:

    • 我最喜欢环视方法。谢谢!
    【解决方案2】:

    您可以使用环视来实现您的目标:\{(?!0\})|(?&lt;!\{0)\}

    解释:

    \{(?!0\}) - 匹配 { 如果它后面没有 0}(由于负前瞻)

    | - 交替

    (?&lt;!\{0)\} - 如果前面没有 {0,则匹配 }(由于负面的后视)

    Demo

    代码示例:

    Regex.Replace("AbC{de{0} x{1}}", @"{(?!0\})|(?<!\{0)\}", "")
    

    【讨论】:

    • 这个解决方案已经发布在我的回答中。带有详细信息和演示。为什么要重复?
    猜你喜欢
    • 2020-10-10
    • 2020-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多