正则表达式,用于删除XML标记及其内容

我有以下字符串,我想删除** (注意其中需要删除的其他标记内容),而不使用XML解析器(对于细小的琴弦,头顶太大)。

 The big black cat sleeps. 

VB.NET或C#中的任何正则表达式都可以。

如果您只想从字符串中删除所有标记,请使用此(C#):

 try { yourstring = Regex.Replace(yourstring, "(<[be]pt[^>]+>.+?)", ""); } catch (ArgumentException ex) { // Syntax error in the regular expression } 

编辑:

我决定用更好的选择添加我的解决方案。 如果有嵌入式标签,则前一个选项不起作用。 这个新的解决方案应该删除所有<** pt *>标签,无论是否嵌入。 此外,此解决方案使用对原始[be]匹配的反向引用,以便找到完全匹配的结束标记。 此解决方案还创建了一个可重用的Regex对象,以提高性能,以便每次迭代都不必重新编译正则表达式:

 bool FoundMatch = false; try { Regex regex = new Regex(@"<([be])pt[^>]+>.+?"); while(regex.IsMatch(yourstring) ) { yourstring = regex.Replace(yourstring, ""); } } catch (ArgumentException ex) { // Syntax error in the regular expression } 

补充说明:

在评论中,用户表示担心’。’ 模式匹配器将是cpu密集型。 虽然在独立贪婪’。’的情况下也是如此,但是使用非贪婪的字符’?’ 导致正则表达式引擎只向前看,直到找到模式中下一个字符的第一个匹配而不是贪婪的’。’ 这要求引擎一直向前看到字符串的末尾。 我使用RegexBuddy作为正则表达式开发工具,它包含一个调试器,可以让您看到不同正则表达式模式的相对性能。 如果需要,它还会自动评论你的正则表达式,所以我决定在这里包含这些注释来解释上面使用的正则表达式:

  // <([be])pt[^>]+>.+? // // Match the character "<" literally «<» // Match the regular expression below and capture its match into backreference number 1 «([be])» // Match a single character present in the list "be" «[be]» // Match the characters "pt" literally «pt» // Match any character that is not a ">" «[^>]+» // Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+» // Match the character ">" literally «>» // Match any single character that is not a line break character «.+?» // Between one and unlimited times, as few times as possible, expanding as needed (lazy) «+?» // Match the characters "" literally «pt>» 

我认为你想完全放弃标签?

 (.*?)|(.*?) 

的? *之后使它变得非贪婪,所以它会尝试匹配尽可能少的字符。

你将遇到的一个问题是嵌套标签。 东西不会看到第二个,因为第一个匹配。

为什么你说开销太大了? 你测量过了吗? 或者你在猜?

使用正则表达式而不是正确的解析器是一种捷径,当有人出现像”>之类的东西时,你可能会遇到这种情况。

.NET正则表达式引擎是否支持负面前瞻? 如果是,那么你可以使用

 (<([eb])pt[^>]+>((?!).)+) 

这让大黑猫睡了。 如果删除所有匹配项,则超出上面的字符串。 但请记住,如果您有嵌套的bpt / ept元素,它将无法工作。 您可能还希望在某些位置添加\s以允许在关闭元素等中添加额外的空格。

如果您要使用正则表达式删除XML元素,则最好确保输入XML不使用来自不同命名空间的元素,或者包含您不想修改其内容的CDATA部分。

正确的(即性能和正确)方法是使用XSLT。 将除特定元素之外的所有内容复制到输出的XSLT转换是身份转换的一个简单扩展。 编译转换后,它将非常快速地执行。 它不会包含任何隐藏的缺陷。

是否有任何可能的方法来获取regex.pattern的xml类型的文本的全局解决方案? 这样我将摆脱替换function和shell使用正则表达式。麻烦的是分析<>按顺序进行分析。还将保留字符替换为’&等等。这里代码’处理特殊chars函数Friend Function ReplaceSpecChars(ByVal str As String)As String Dim arrLessThan As New Collection Dim arrGreaterThan As New Collection If Is IsNull(str)Then

  str = CStr(str) If Len(str) > 0 Then str = Replace(str, "&", "&") str = Replace(str, "'", "'") str = Replace(str, """", """) arrLessThan = FindLocationOfChar("<", str) arrGreaterThan = FindLocationOfChar(">", str) str = ChangeGreaterLess(arrLessThan, arrGreaterThan, str) str = Replace(str, Chr(13), "chr(13)") str = Replace(str, Chr(10), "chr(10)") End If Return str Else Return "" End If 

结束函数朋友函数ChangeGreaterLess(ByVal lh As Collection,ByVal gr As Collection,ByVal str As String)As String for i As Integer = 0 to lh.Count If CInt(lh.Item(i))> CInt(gr.Item( i))然后str =替换(str,“<”,“<”)/////////问题////结束如果

  Next str = Replace(str, ">", ">") 

结束函数朋友函数FindLocationOfChar(ByVal chr作为Char,ByVal str作为字符串)作为集合Dim arr作为新集合对于i作为整数= 1到str.Length() – 1如果str.ToCharArray(i,1)= chr然后arr .Add(i)End If Next返回arr结束function

在问号上遇到麻烦

这是一个标准的xml,我想分析不同的标签..

你测量过这个吗? 我使用.NET的正则表达式引擎遇到了性能问题,但相比之下,使用Xml解析器解析了大约40GB的xml文件(但是,您需要使用XmlReader来处理更大的字符串)。

请发布一个实际的代码示例并提及您的性能要求:如果性能很重要,我怀疑Regex类是最好的解决方案。