捕获与另一个组不匹配的字符串的一部分(C#Regex)

时间:2009-12-05 01:39:30

标签: .net regex

我正在开发一个需要解析“格式化标签”的项目。通过使用这样的标记:<b>text</b>,它会修改文本的外观(该标记使文本变为粗体)。一个标记最多可包含4个标识符(粗体b,斜体i,下划线u和删除线s

例如:

<bi>some</b> text</i> here会在此处生成 一些 文本

要解析这些标记,我试图使用RegEx捕获第一个开始标记之前的任何文本,然后捕获任何标记及其随附的文本。现在,我有这个:

<(?<open>[bius]{1,4})>(?<text>.+?)</(?<close>[bius]{1,4})>

匹配单个标记,其附带的文本以及单个对应的结束标记。

现在,我遍历每一个字符并尝试将字符串中的位置与字符串的末尾匹配,例如我尝试匹配i = 0处的整个字符串,位置1的子字符串到i = 1的结尾等等。

然而,这种方法非常低效。看起来最好在一个RegEx中匹配整个字符串,而不是手动迭代字符串。

我的实际问题是,是否可以匹配匹配组的字符串,例如标记?我用Google搜索没有成功,但也许我没有使用正确的词语。

3 个答案:

答案 0 :(得分:1)

我认为尝试在一个正则表达式中解析和验证整个文本可能会给你带来麻烦。您正在解析的文本不是常规语言,因此正则表达式不是为此目的而设计的。

相反,我建议您首先将输入标记为单个标记和标记之间的文本。您可以使用简单的正则表达式来查找单个标记 - 这是一个更简单的问题,正则表达式可以很好地处理。一旦对其进行了标记化,您就可以使用普通循环迭代标记,并根据需要对文本应用格式。

答案 1 :(得分:0)

尝试使用^(.*?)为正则表达式添加前缀(匹配字符串开头的任何字符,非贪婪)。因此,它将匹配字符串开头处发生的任何事情,但它将尽可能少地匹配,同时仍然具有正则表达式的其余部分匹配。因此,您将获取在第一个捕获组中未正常匹配的所有内容。

答案 2 :(得分:0)

Why don't you use an HTML parser for this

  

您应该使用XML parsernot regexesXML is not a regular languagehence not easely parseable a regular expressionDon't do it

     
    

Never use regular expressions or basic string parsing to process XML。现在常用的每种语言都有完美的XML支持。 XML是一个看似复杂的标准,你的代码不太可能正确地解析所有格式良好的XML输入,即使它是,你也浪费你的时间,因为(正如刚才提到的)每一种语言都是常见用法有XML支持。使用正则表达式解析XML是不专业的。