Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用正则表达式删除内部嵌套字符串_Regex_Vbscript_Nested - Fatal编程技术网

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

Regex 使用正则表达式删除内部嵌套字符串,regex,vbscript,nested,Regex,Vbscript,Nested,我有一个由标记替换形成的字符串,这也会导致字符串的某些部分被标记为删除,例如: Keep1 {/*DELETE} Delete1a {/*DELETE} Delete2 {DELETE*/} Delete1b {DELETE*/} Keep2 {/*DELETE} Delete3 {DELETE*/} Keep3 正则表达式不能仅用于选择内部的DELETE2和DELETE3,删除它们,然后重复获取DELETE1a/b,直到找不到进一步的匹配项,这是正确的吗 我传递给re

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

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}
{DELETE*/}
标记更改为单个字符

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

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
多字符分隔符 如果分隔符是多字符标记,则可以使用:

它将匹配任何字符,0+次,这不是
{/*DELETE}
字符序列的起点。以递归方式运行此正则表达式替换,请参阅和演示

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

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

^\s*\{\/\*DELETE}(\s*(?:\r?\n(?!\s*\{(?:\/\*DELETE|DELETE\*\/)}).*)*)\r?\n\s*\{DELETE\*\/}\s*$
请参阅和2个演示(此处,您需要启用
regExp.Multiline=True

单字符分隔符 这是到目前为止最简单的场景-您可以先使用起始分隔符字符,然后使用否定字符类匹配除起始分隔符字符和结束分隔符字符以外的任何0+字符,然后再匹配结束分隔符字符

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

\[[^\][]*\]
请参阅regex演示:和

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


请参见。

请澄清:您是否希望最后以三行形式获得
Keep1 Keep2 Keep3
?你能把标签改成单字符是什么意思?使用相同的字符作为块的开始/结束分隔符不是一个好主意,最好使用一对不同的字符作为分隔符。我是否正确认为不能使用正则表达式仅选择内部DELETE2和DELETE3,删除它们,然后重复获取DELETE1a/b,直到找不到进一步的匹配?那要看情况。在一些边缘情况下,您可以使用正则表达式,但不是一般情况。我知道您可以在其他语言中使用此正则表达式:
({/\*DELETE}(?:*(?1)。*?|*?{DELETE\*/})
,但我目前无法测试vbscript。@Wiktor Stribiżew-我的意思是在开始/结束时使用不同的单个字符,例如,如果排除单个字符(在正则表达式中)比排除整个{TAG}@Kristen更容易,请添加一个示例。@Kristen我认为您应该使用
允许在数据中使用常用括号。或者检查Unicode表中更奇怪的东西:)“全宽左白括号”(U+FF5F)-从来都不知道这是一件事,更不用说它的表亲了,比如“左白龟壳括号”!谢谢,看起来很理想。
\[[^\][]*\]
\u2985[^\u2985\u2986]*\u2986