如何从文本中删除任何给定的字符串对

Posted

技术标签:

【中文标题】如何从文本中删除任何给定的字符串对【英文标题】:How to remove any given string pairs from text 【发布时间】:2020-05-17 03:39:06 【问题描述】:

不幸的是,我的正则表达式技能非常糟糕

我想编写一个函数,可以删除任何给定的字符串对以及它们之间的任何内容

例如

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as op<!--posed to using--> 'Content here, content here', making it look like readable English. Many desktop publishing packages <!--and web page<!-- asdasasdas--> editors now use--> Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).

从上面的示例文本中,我想删除这些字符串对以及其中的任何内容 &lt;!-- --&gt;

删除后的示例文本如下

It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as op 'Content here, content here', making it look like readable English. Many desktop publishing packages  Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).

这个任务有什么简单的功能吗?我不想为此使用特定的正则表达式

它应该是一个需要 3 个参数的函数

参数1:文本

参数 2:字符串对的开始部分,例如&lt;!--

参数 3:字符串对的结尾部分,例如--&gt;

使用最新的.net framework 4.8+

编辑

例如链接的答案在此失败

ing packages <!--and web page<!-- asdasasdas--> editors now use--> Lorem Ipsum

此外,它还必须与多行一起使用

比如

    ok like readable English. Many desktop publishing packages
 <!--
and web page<!-- asdasasdas--> editors no
    w use--> Lorem Ipsum as their de

会变成

    ok like readable English. Many desktop publishing packages


     Lorem Ipsum as their de

这里是代码示例

这里是示例。示例 4 目前无法正常工作

https://dotnetfiddle.net/mA3waq

【问题讨论】:

链接的答案不处理内部字符串对。我已经更新了我的问题 以下正则表达式应该可以工作。确保在修剪评论格式时没有遗漏空格,但这将匹配嵌套的&lt;!--...--&gt;;这是正则表达式:&lt;!--(?&gt;(?!&lt;!--|--&gt;).|&lt;!--(?&lt;D&gt;)|--&gt;(?&lt;-D&gt;))*(?(D)(?!))--&gt; @ZaelinGoodman 不,我不是在寻找具体的解决方案。它必须对每个字符串对都是通用的 什么意思?如果您不指定,正则表达式应该如何知道字符串对是什么?您想匹配的其他字符串对有哪些示例?这在您的测试用例中匹配,因此您确实需要提供更多信息来说明此解决方案不起作用的原因。 如果您对此使用 String.Format ,其中 0 是开始分隔符,1 是结束分隔符,它将按照您的要求进行。 0(?&gt;(?!0|1).|0(?&lt;D&gt;)|1(?&lt;-D&gt;))*(?(D)(?!))1 - 如果有任何特殊字符,请务必转义使用 Regex.Escape 的任何格式,否则这会在你的脸上爆炸 【参考方案1】:

您可以在运行时使用带有分隔符字符串的正则表达式构建。例如,

string FilterString(string source, string beginPattern, string endPattern)

    Regex regex = new Regex($"\\beginPattern.*\\endPattern",RegexOptions.Singleline);
    return regex.Replace(source, string.Empty);

示例输入

packages <!--and web page<!-- asdasasdas--> editors now use--> Lorem

输出

packages  Lorem

Sample

【讨论】:

刚刚测试过,它失败了这个“包 编辑器现在使用--> Lorem” @MonsterMMORPG 我已经更新了结果,请您验证一下 现在可以使用,但是当文本为多行时会损坏。可以进一步修改吗? 无论如何让它支持多线?非常感谢您的帮助。我更新了问题并添加了图片 @MonsterMMORPG 请检查更新的答案。我也更新了示例链接

以上是关于如何从文本中删除任何给定的字符串对的主要内容,如果未能解决你的问题,请参考以下文章

从数组中删除重复的对象

如何使用 AngularJs 从输入或文本区域中删除特殊字符?

如何从 Python 列表中删除重复项并保持顺序? [复制]

如何使用 Pandas 从给定字符串中删除子字符串

从给定字符串中删除重复项(不对其进行排序)[重复]

如何从c ++中的给定目录中删除所有文本文件