Это возможно с регулярным выражением, но LINQ to XML проще. Я включил LINQ to XML и решение для регулярных выражений, хотя я бы предпочел первое.
Вот подход LINQ to XML. Поскольку ul
является верхним элементом, его Name
можно изменить напрямую. Descendants
захватит все вложенные ul
предметы. Единственное предостережение при таком подходе - он работает только в том случае, если входные данные правильно сформированы. Если это неправильно, LINQ to XML не сможет его проанализировать. Кроме того, если он правильно сформирован и ul
не является верхним элементом, но является частью более крупного блока HTML-текста, тогда вам нужно перебрать Elements("ul")
, а затем проделать то же самое с каждым из них.
Если HTML-код искажен, вы можете обратиться к HTML Agility Pack .
Dim xml = XElement.Parse(input)
xml.Name = "textformat"
xml.SetAttributeValue("indent", "0")
For Each item In xml.Descendants("ul")
item.Name = "textformat"
item.SetAttributeValue("indent", "20")
Next
А вот и подход к регулярным выражениям. Нелегко обнаружить первый элемент ul
, чтобы различать два, поэтому этот подход меняет их все на отступ 20, затем делается дополнительный шаг, чтобы найти первый textformat
и изменить его отступ на ноль.
Dim pattern As String = "<ul>|</ul>"
Dim result As String = Regex.Replace(input, pattern, Function(m) If(m.Value.StartsWith("</"), "</textformat>", "<textformat indent=""20"">"))
Dim firstTextFormatPattern As String = "^(?<Start><textformat\s+indent="")\d+?(?<End>"">)"
result = Regex.Replace(result, firstTextFormatPattern, "${Start}0${End}")