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