Как удалить все вхождения подстроки, содержащей неизвестные символы? - PullRequest
2 голосов
/ 15 мая 2019

Обычно вы удаляете все подстроки из строки, используя следующее выражение:

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>'

1 Ответ

1 голос
/ 15 мая 2019

Прежде всего, нужно сказать - регулярное выражение не является подходящим инструментом для работы при попытке анализа или манипулирования 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"

Суть в том, что регулярное выражение очень гибкое, поэтому какие правила вы хотите навязать ему, или какие варианты вы хотите разрешить с ним, решать только вам. Вот краткое руководство для синтаксиса регулярных выражений в .NET.

...