【问题标题】:Regex Matching defined tags in c#正则表达式匹配c#中定义的标签
【发布时间】:2012-03-26 04:24:12
【问题描述】:

我有这个字符串

 This is a <143>sample</143> regex <143>pa<665>t</665>tern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175>

我应该只是通过标签获得匹配。我用它来突出显示文本。

预期输出:

<143>sample</143>
<143>pa<665>t</665>tern</143>
<665>t</665>
<143>by</143>
<128>c#</128>
<132>name</132>
<175>Vincent</175>

我试过这个正则表达式模式:

<(143|128|132|175)>.*</(143|128|132|175)> 

但它会将所有结果打印为匹配,整个字符串。

请帮忙。


跟进问题

我可以单独获取标签内的文本,而不是获取整行匹配项吗?就像我只是得到 sample 而不是 sample`/143>

【问题讨论】:

  • 啊是的我忘了..它是嵌套标签
  • 好吧.. 这与 HTML 标记不匹配
  • 你试过把它当作 XML 吗?
  • @HenkHolterman:XML 标签可以以数字开头吗?我在看here,但似乎不允许。

标签: c# regex


【解决方案1】:

这两项更改应该会对您有所帮助:

试试这个:

<(143|128|132|175)>.*?</\1> 

关于“啊,是的,我忘了.. 它是嵌套标签”:那么使用正则表达式可能是不明智的。嵌套标签不是常规语言。

【讨论】:

  • 反向引用是一个不错的选择,但并不是真正需要的。
  • .. 除非它是嵌套标签。在这种情况下,它将派上用场。 :)
  • ahh.. 所以我最好改变将其设为嵌套标签的想法.. 好吧,解决方案 .*?\1>正在工作..谢谢先生..
  • 您好,我可以继续回答后续问题吗?无需创建另一个线程。
  • @vrynxzent:通常最好创建一个新问题。如果相关,您可以添加指向此问题的链接。
【解决方案2】:

如前所述,您应该在这里使用惰性匹配。它是通过将? 附加到您的量词来实现的。在您的情况下,它是*

此外,为了简化您的工作,您可以使用命名捕获。 .NET 完全支持它。这是一个示例代码

var target = @"This is a <143>sample</143> regex <143>pattern</143> selection <143>by</143> tags in <128>c#</128> and my <132>name</132> is <175>Vincent</175>";
var pattern = new Regex("<(143|128|132|175)>(?<Content>.*?)</\\1>", RegexOptions.IgnoreCase);
var result = pattern.Matches(target);
for (var j = 0; j < result.Count; j++) {
    var capts = result[j].Groups["Content"].Captures;
    for (var i = 0; i < capts.Count; i++) {
        Console.WriteLine(capts[i].Value);
    }
}

【讨论】:

    【解决方案3】:

    这是因为 .* 是贪婪的..

    您可以通过添加 ?:.*? 使其不贪婪

    你可以让它匹配除“>”之外的任何东西:[^&lt;]*

    我通常选择最后一个,因为它更容易记住并且在大多数情况下都有效..

    【讨论】:

      猜你喜欢
      • 2018-06-10
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 2013-04-30
      • 1970-01-01
      相关资源
      最近更新 更多