将ul转换为textformat并返回的正则表达式,第一个标记具有不同的属性值(VB.NET)

将ul转换为textformat并返回的正则表达式,第一个标记具有不同的属性值(VB.NET),vb.net,regex,Vb.net,Regex,这是一个与我在这里提出的一个问题相关的问题,请参阅下面的链接,了解我为什么尝试这样做 基本上,我需要一个正则表达式替换函数(或者如果这可以在纯VB中完成,那么这很好)来将字符串中的所有ul标记转换为textindent标记,第一个textindent标记具有不同的属性值 例如: <ul> <li>This is some text</li> <li>This is some more text</li> <li

这是一个与我在这里提出的一个问题相关的问题,请参阅下面的链接,了解我为什么尝试这样做

基本上,我需要一个正则表达式替换函数(或者如果这可以在纯VB中完成,那么这很好)来将字符串中的所有ul标记转换为textindent标记,第一个textindent标记具有不同的属性值

例如:

<ul>
   <li>This is some text</li>
   <li>This is some more text</li>
   <li>
      <ul>
         <li>This is some indented text</li>
         <li>This is some more text</li>
      </ul>
   </li>
   <li>More text!</li>
   <li>
      <ul>
         <li>This is some indented text</li>
         <li>This is some more text</li>
      </ul>
   </li>
   <li>More text!</li>
</ul>

<ul>
   <li>Another list item</li>
   <li>
      <ul>
         <li>Another nested list item</li>
       </ul>
   </li>
</ul>
  • 这是一些文本
  • 这是更多的文本
    • 这是一些缩进的文本
    • 这是更多的文本
  • 更多文字
    • 这是一些缩进的文本
    • 这是更多的文本
  • 更多文字
  • 另一个列表项
    • 另一个嵌套列表项
将成为:

<textformat indent="0">
   <li>This is some text</li>
   <li>This is some more text</li>
   <li>
      <textformat indent="20">
         <li>This is some indented text</li>
         <li>This is some more text</li>
      </textformat>
   </li>
   <li>More text!</li>
   <li>
      <textformat indent="20">
         <li>This is some indented text</li>
         <li>This is some more text</li>
      </textformat>
   </li>
   <li>More text!</li>
</textformat>

<textformat indent="0">
   <li>Another list item</li>
   <li>
      <textformat indent="20">
         <li>Another nested list item</li>
      </textformat>
   </li>
</textformat>

  • 这是一些文本
  • 这是更多的文本
  • 这是一些缩进的文本
  • 这是更多的文本
  • 更多文字
  • 这是一些缩进的文本
  • 这是更多的文本
  • 更多文字
  • 另一个列表项
  • 另一个嵌套列表项
  • 基本上我希望第一个ul标签没有缩进,但是所有嵌套的ul标签都有20个缩进

    我很感激这是一个奇怪的要求,但希望这是有意义的,请让我知道如果你有任何问题


    提前感谢。

    使用正则表达式是可能的,但是LINQ到XML更简单。我已经包括了LINQtoXML和一个正则表达式解决方案,尽管我更喜欢前者

    这里是LINQ到XML的方法。由于
    ul
    是顶级元素,因此其
    名称可以直接更改<代码>子体将获取所有嵌套的
    ul
    项。这种方法唯一需要注意的是,只有在输入格式正确的情况下,它才有效。如果错误,linqtoxml将无法解析它。此外,如果它是格式良好的,
    ul
    不是顶部元素,而是更大的HTML文本块的一部分,那么您需要在
    元素(“ul”)
    上循环,然后对每个元素执行相同的操作

    如果HTML格式不正确,您可能需要查看

    这里是正则表达式方法。要检测第一个
    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}")
    
    Dim pattern As String=“
      |

    Dim result As String=Regex.Replace(输入、模式、函数)(m)If(m.Value.StartsWith(“谢谢您的帮助,我已经通过您的回复自己找到了解决方案

    基本上,我使用计数器跟踪正则表达式找到的ul标记的级别,然后用相关属性替换它:

    Dim ulCounter As Integer = 0    
    Dim rxUL As New Regex("<ul>|</ul>")
    
    xmlValue = rxUL.Replace(xmlValue, AddressOf Convert_UL)
    
    
    Protected Function Convert_UL(ByVal m As Match) As String
    
        Dim HTML As String = ""
    
        If m.Value = "</ul>" Then
            ulCounter -= 1
    
            HTML = "</textformat>"
        Else
            ulCounter += 1
    
            If ulCounter > 1 Then
                HTML = "<textformat indent=""20"">"
            Else
                HTML = "<textformat indent=""0"">"
            End If
        End If
    
        Return HTML
    
    End Function
    
    Dim ulCounter作为整数=0
    作为新正则表达式的Dim rxUL(“
      |
    ”) xmlValue=rxUL.Replace(xmlValue,转换的地址) 受保护的函数将_UL(ByVal m作为匹配项)转换为字符串 将HTML设置为字符串=“” 如果m.Value=“”则 ulCounter-=1 HTML=“” 其他的 ulCounter+=1 如果ulCounter>1,则 HTML=“” 其他的 HTML=“” 如果结束 如果结束 返回HTML 端函数

    这是一个非常随机的请求,因此我不确定这对其他人会有多大帮助,但以防万一,我就是这样度过了难关的!

    再次感谢您的帮助。我正在研究LINQ解决方案的HTML敏捷性包,因为这会引发很多异常(我基于Flash的HTML通常会出现格式错误)。对于您的正则表达式解决方案,最终替换语句似乎不起作用,第一个textformat标记没有更改为缩进属性设置为零。此外,对于这两个解决方案,它们是否可以处理同一字符串中的多个ULs?(特别是转换第一个标记的缩进属性)我的意思是,如果他们用我上面的例子检索了一个字符串两次,我希望这是有意义的…@chapmanio最后一个模式假设输入是字符串的开头。如果它发生在较大字符串中的任何位置,它将不起作用。要回答您的另一个问题,第一个正则表达式模式将影响字符串中的所有事件。LINQ to XML需要调整以获得所有
    元素(“ul”)
    ,以在根级别找到所有
    ul
    元素。然后
    foreach
    覆盖它们,获得它们的
    子体,并继续执行,如我的示例所示。整个字符串的外观会有所不同。很高兴您找到了问题的解决方案。
    
    Dim ulCounter As Integer = 0    
    Dim rxUL As New Regex("<ul>|</ul>")
    
    xmlValue = rxUL.Replace(xmlValue, AddressOf Convert_UL)
    
    
    Protected Function Convert_UL(ByVal m As Match) As String
    
        Dim HTML As String = ""
    
        If m.Value = "</ul>" Then
            ulCounter -= 1
    
            HTML = "</textformat>"
        Else
            ulCounter += 1
    
            If ulCounter > 1 Then
                HTML = "<textformat indent=""20"">"
            Else
                HTML = "<textformat indent=""0"">"
            End If
        End If
    
        Return HTML
    
    End Function