代码之家  ›  专栏  ›  技术社区  ›  Kristen

用正则表达式删除内部嵌套字符串

  •  2
  • Kristen  · 技术社区  · 8 年前

    我有一个由标记替换形成的字符串,这也会导致字符串的某些部分被标记为删除,例如:

    Keep1
    {/*DELETE}
    Delete1a
        {/*DELETE}
        Delete2
        {DELETE*/}
    Delete1b
    {DELETE*/}
    Keep2
    {/*DELETE}
    Delete3
    {DELETE*/}
    Keep3
    

    正则表达式不能仅用于选择内部的DELETE2和DELETE3,删除它们,然后重复获取DELETE1a/b,直到没有找到其他匹配项,对吗?

    我传递给replace函数的正则表达式是

    \{\/\*DELETE\}([\s\S]*?)\{DELETE\*\/\}
    

    这与

    {/*DELETE}
    Delete1a
        {/*DELETE}
        Delete2
        {DELETE*/}
    

    如果这是我能做的唯一正则表达式匹配,我可以[ 抑制前导 {/*DELETE} ]递归调用replace函数,我认为这将使我能够删除嵌套的{TAGS}

    是更好的方法吗?

    我在VBScript中使用正则表达式

    编辑 :如果有帮助,我可以更改 {/*删除} {DELETE*/}

    编辑2 :我可以使用单个字符作为开始/结束删除标记-例如,如果正则表达式能够更快地解析,例如通过降低复杂度

    e、 g.如果开始删除是 [ 然后结束删除是 ]

    Keep1
    [
    Delete1a
        [
        Delete2
        ]
    Delete1b
    ]
    Keep2
    [
    Delete3
    ]
    Keep3
    

    在本例中,这些字符的外观选择,实际上它们会出现在我的真实数据中,但我希望我可以选择两个根本不出现在我的数据中的ASCII值。

    澄清 :由于{DELETE}标记本身并不总是出现在一行上,因此也将存在这种字符串形式

    Keep1{/*DELETE}Delete1a
        {/*DELETE}Delete2{DELETE*/}
    Delete1b{DELETE*/}Keep2a
    Keep2b{/*DELETE}Delete3{DELETE*/}Keep3
    

    或使用单字符删除标记:

    Keep1[Delete1a
        [Delete2]
    Delete1b]Keep2a
    Keep2b[Delete3]Keep3
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   Community Mohan Dere    6 年前

    多字符分隔符

    如果分隔符是多字符标记,则可以使用 tempered greedy token

    \{\/\*DELETE}((?:(?!\{\/\*DELETE})[\s\S])*?)\{DELETE\*\/}
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    这将匹配任何字符,0+次,这不是 {/*DELETE} 字符序列。递归运行此正则表达式替换,请参阅 Iteration 1 Iteration 2 演示。

    注释 如果在注释或字符串文字中包含这些分隔符,则无法正常工作。

    为了安全起见,您可以定义定界标记仅在一条线上显示为单个实体:

    ^\s*\{\/\*DELETE}(\s*(?:\r?\n(?!\s*\{(?:\/\*DELETE|DELETE\*\/)}).*)*)\r?\n\s*\{DELETE\*\/}\s*$
    

    看见 Iteration 1 Iteration 2个演示(在这里,您需要启用 regExp.Multiline = True )

    单字符分隔符

    如果起始分隔符字符为 [ 结束分隔符char为 ] ,正则表达式是一个众所周知的

    \[[^\][]*\]
    

    请参阅正则表达式演示: Iteration 1 Iteration 2 .

    [ ] 通常是您需要的数据的一部分,因此,您可能需要使用一些更奇特的配对内容,例如 ⦠2985左白括号 )和 ⦆ ( 2986右白括号 ):

    \u2985[^\u2985\u2986]*\u2986
    

    看见 another regex demo