【问题标题】:How to remove all ocurrences of a substring containing unknown characters?如何删除所有出现的包含未知字符的子字符串?
【发布时间】:2019-05-15 15:01:34
【问题描述】:

通常,您会使用以下表达式从字符串中删除所有子字符串:

text.Replace(" uipath_custom_id=""587""","")

这会删除字符串中的所有子字符串,并且在没有任何此类子字符串时不会抛出异常。

但是如果引号之间有未知字符怎么办?有未知字符时如何达到相同的结果?

这是我要处理的字符串。有时它包含多个“uipath_custom_id=""587""" 子字符串,有时没有。

outerhtml='<div class="_3_7SH _3DFk6 message-out" uipath_custom_id="567"><div class="Tkt2p"><div class="copyable-text" data-pre-plain-text="[9:42 AM, 5/15/2019] sash: "><div class="_3zb-j ZhF0n"><span dir="ltr" class="selectable-text invisible-space copyable-text">Hello World!</span></div></div><div class="_2f-RV"><div class="_1DZAH" role="button"><span class="_3EFt_">9:42 AM</span><div class="_32uRw"><span data-icon="msg-time" class=""><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 15" width="16" height="15"><path fill="#859479" d="M9.75 7.713H8.244V5.359a.5.5 0 0 0-.5-.5H7.65a.5.5 0 0 0-.5.5v2.947a.5.5 0 0 0 .5.5h.094l.003-.001.003.002h2a.5.5 0 0 0 .5-.5v-.094a.5.5 0 0 0-.5-.5zm0-5.263h-3.5c-1.82 0-3.3 1.48-3.3 3.3v3.5c0 1.82 1.48 3.3 3.3 3.3h3.5c1.82 0 3.3-1.48 3.3-3.3v-3.5c0-1.82-1.48-3.3-3.3-3.3zm2 6.8a2 2 0 0 1-2 2h-3.5a2 2 0 0 1-2-2v-3.5a2 2 0 0 1 2-2h3.5a2 2 0 0 1 2 2v3.5z"></path></svg></span></div></div></div></div><span></span></div>'

【问题讨论】:

  • 定义“未知字符”,它们是什么以及为什么会出现?

标签: string vb.net replace character


【解决方案1】:

首先,必须说——当尝试解析或操作 HTML 时,正则表达式不是正确的工具。 HTML 不是“常规语言”,因此如果您愿意,正则表达式不足以处理解析它们。话虽这么说,如果您尝试对 HTML 执行的操作足够简单,并且被解析的 HTML 在其内容和格式方面相对一致,那么有时正则表达式就可以了,而成熟的 HTML 解析引擎只是矫枉过正。如果是这种情况,那么您可以像这样使用正则表达式:

Dim outerHtml As String = "<div class=""_3_7SH _3DFk6 message-out"" uipath_custom_id=""567""><div class=""Tkt2p""><div class=""copyable-text"" data-pre-plain-text=""[9:42 AM, 5/15/2019] sash: ""><div class=""_3zb-j ZhF0n""><span dir=""ltr"" class=""selectable-text invisible-space copyable-text"">Hello World!</span></div></div><div class=""_2f-RV""><div class=""_1DZAH"" role=""button""><span class=""_3EFt_"">9:42 AM</span><div class=""_32uRw""><span data-icon=""msg-time"" class=""""><svg id=""Layer_1"" xmlns=""http://www.w3.org/2000/svg"" viewBox=""0 0 16 15"" width=""16"" height=""15""><path fill=""#859479"" d=""M9.75 7.713H8.244V5.359a.5.5 0 0 0-.5-.5H7.65a.5.5 0 0 0-.5.5v2.947a.5.5 0 0 0 .5.5h.094l.003-.001.003.002h2a.5.5 0 0 0 .5-.5v-.094a.5.5 0 0 0-.5-.5zm0-5.263h-3.5c-1.82 0-3.3 1.48-3.3 3.3v3.5c0 1.82 1.48 3.3 3.3 3.3h3.5c1.82 0 3.3-1.48 3.3-3.3v-3.5c0-1.82-1.48-3.3-3.3-3.3zm2 6.8a2 2 0 0 1-2 2h-3.5a2 2 0 0 1-2-2v-3.5a2 2 0 0 1 2-2h3.5a2 2 0 0 1 2 2v3.5z""></path></svg></span></div></div></div></div><span></span></div>"
Dim pattern As String = "\buipath_custom_id=""[^""]+""\b"
outerHtml = Regex.Replace(outerHtml, pattern, "")

根据您的需要,您可以使模式更严格。例如,您可以通过使用\d 而不是[^""],将引号之间的“未知”文本限制为仅在它是数字时才被替换。或者,你可以让它变得更宽容。例如,您可以通过在等号两侧添加 \s* 来使其允许在等号周围留有空格,如下所示:

Dim pattern As String = "\buipath_custom_id\s*=\s*""\d+""\b"

关键是,正则表达式非常灵活,因此您想对其施加哪些规则,或者您希望允许哪些变化取决于您。 Here's a handy quick-reference guide 用于 .NET 中的正则表达式语法。

【讨论】:

  • 是的!在这种情况下,正则表达式似乎工作得很好;并且绝对是未来要记住的另一个工具。谢谢!
  • 是的,如你所见,它非常强大,所以一旦你学会了它,你就会开始寻找各种可以使用它的地方。然而,可能比在代码中使用它更有用的是大多数语言和开发工具也支持正则表达式。因此,例如,您可以在 Visual Studio 的查找/替换功能中使用正则表达式,或在命令行中使用 grep 等。因此,熟悉它是值得投资的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-07
  • 2022-01-19
  • 1970-01-01
  • 2013-12-18
  • 1970-01-01
  • 2022-08-19
  • 1970-01-01
相关资源
最近更新 更多