我有一个由标签替换形成的字符串,这也会导致字符串的某些部分被标记为删除,例如:
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 1和 Iteration 2演示。
注意,如果注释或字符串文字中有这些分隔符,则这将无法正常工作。
为了安全起见,您可以定义分隔标记仅在一行中显示为单个实体:
^\s*\{\/\*DELETE}(\s*(?:\r?\n(?!\s*\{(?:\/\*DELETE|DELETE\*\/)}).*)*)\r?\n\s*\{DELETE\*\/}\s*$
参见Iteration 1和 Iteration 2 个演示(此处,您需要启用 regExp.Multiline = True
)
单个字符分隔符
这是迄今为止最简单的场景 - 您可以使用起始分隔符字符,然后使用否定字符类匹配除了起始和结束分隔符字符之外的任何 0+ 个字符 - 然后是结束分隔符字符。
如果起始分隔符是[
,结束分隔符是]
,则该正则表达式是众所周知的
\[[^\][]*\]
查看正则表达式演示:Iteration 1和 Iteration 2 .
请注意,[
和 ]
通常是您需要的数据的一部分,因此也许您会想要使用一些更奇特的配对内容,例如 ⦅
(2985 左白括号)和 ⦆
(2986 右白括号):
\u2985[^\u2985\u2986]*\u2986
关于regex - 使用 RegEx 删除内部嵌套字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47076195/