regex - 使用 RegEx 删除内部嵌套字符串

标签 regex vbscript nested

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

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

我是否正确,正则表达式不能用于仅选择内部 DELETE2 和 DELETE3,删除它们,然后重复获取 DELETE1a/b 直到找不到进一步的匹配项?

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

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

这匹配

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

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

有更好的方法吗?

我在 VBScript 中使用 RegEx

编辑:如果有帮助,我可以更改 {/*DELETE}{DELETE*/} 标签,甚至更改为单个字符

EDIT2:我可以使用单个字符作为开始/结束删除标记 - 例如,如果 RegEx 表达式解析速度更快,例如通过降低复杂性

例如如果开始删除是[,然后结束删除是]

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

最佳答案

多字符分隔符

如果您的分隔符是多字符标签,您可以使用 tempered greedy token :

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

将匹配任意字符 0 次以上,且该字符不是 {/*DELETE} 字符序列的起点。递归运行此正则表达式替换,请参阅 Iteration 1Iteration 2演示。

注意,如果注释或字符串文字中有这些分隔符,则这将无法正常工作。

为了安全起见,您可以定义分隔标记仅在一行中显示为单个实体:

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

参见Iteration 1Iteration 2 个演示(此处,您需要启用 regExp.Multiline = True)

单个字符分隔符

这是迄今为止最简单的场景 - 您可以使用起始分隔符字符,然后使用否定字符类匹配除了起始和结束分隔符字符之外的任何 0+ 个字符 - 然后是结束分隔符字符。

如果起始分隔符是[,结束分隔符是],则该正则表达式是众所周知的

\[[^\][]*\]

查看正则表达式演示:Iteration 1Iteration 2 .

请注意,[] 通常是您需要的数据的一部分,因此也许您会想要使用一些更奇特的配对内容,例如 (‎2985 左白括号)和 (‎2986 右白括号):

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

参见another regex demo .

关于regex - 使用 RegEx 删除内部嵌套字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47076195/

相关文章:

javascript - 选择中最接近的匹配

c++ - 从 Exchange Server 2003 获取信息?

c# - IIS 保存 Word 文档的权限

php - 在删除/替换非单词字符时处理 unicode

javascript - 正则表达式捕获 utf-8 行分隔符

ruby-on-rails - Rails 3. 为什么进入编辑页面时我的嵌套记录被删除了?

Python:按嵌套字典值排序(无类别)

r - 在 R 的当前目录中创建嵌套文件夹?

regex - 使用 mod-rewrite 创建静态的、SEO 友好的 URL

networking - 在 vbscript 中在另一台计算机上显示消息框?