如何匹配<>之间的字符串?

How to match a string between <>?

我尝试了 \w+\:(\w+\-?\.?(\d+)?) 但那是不正确的

我有以下文字

<staticText:HelloWorld>_<xmlNode:Node.03>_<date:yyy-MM-dd>_<time:HH-mm-ss-fff>

The end result I want is something like the following

["staticText:HelloWorld", "xmlNode:Node.03","date:yyy-MM-dd","time:HH-mm-ss-fff"]

您可以使用以下正则表达式。

<(.*?)>

然后看看小组如何检索结果。

Regex rx = new Regex("<(.*?)>");
string text = "<staticText:HelloWorld>_<xmlNode:Node.03>_<date:yyy-MM-dd>_<time:HH-mm-ss-fff>";

MatchCollection matches = rx.Matches(text);
Console.WriteLine(matches.Count);

foreach(Match match in matches){
    var groups = match.Groups;
    Console.WriteLine(groups[1]);
}

这一行应该可以匹配到内容:

<(.*?)>

它会捕捉到你似乎不想要的末尾的箭头,但你可以在没有正则表达式的情况下将它们删除。

您应该考虑像 https://regexr.com 这样的网站 - 它允许您粘贴案例并查看它如何与它们一起工作,从而极大地帮助编写正则表达式。

匹配 <> 中的任何字符串。希望这有帮助。

<(.*?)>

您的模式与示例数据的第 3 部分和第 4 部分不匹配,因为在这部分 \w+\-?\.?(\d+)? 破折号和数字仅匹配一次且不重复。

对于您的示例数据,您可以使用 character class [\w.-]+ 来匹配冒号后的部分,使匹配更广泛一些:

<(\w+\:[\w.-]+)>

Regex demo | C# demo

或者为了使其更具体,请使用重复模式为 Node.03 部分和年月日时等部分指定模式。

<(\w+\:\w+(?:\.\d+|\d+(?:-\d+)+)?)>

说明

  • < 匹配 <
  • ( 捕获组
    • \w+\:\w+ 匹配 1+ 个单词字符,: 和 1+ 个单词字符
    • (?:非捕获组
      • \.\d+ 匹配 . 和 1+ 个数字
      • |
      • \d+(?:-\d+)+ 匹配 1+ 位并重复 1+ 次匹配 - 和 1+ 位
    • )? 关闭非捕获组并使其可选
  • ) 关闭捕获组
  • >

Regex demo | C# Demo