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

时间:2019-05-30 17:09:13

标签: c# regex regex-lookarounds regex-group

我尝试了\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"]

4 个答案:

答案 0 :(得分:2)

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

<(.*?)>

然后看看组如何工作以检索结果。

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]);
}

答案 1 :(得分:2)

此行应该能够匹配内容:

<(.*?)>

它会在您似乎不需要的末端捕获箭头,但是您可以在不使用正则表达式的单词后将其删除。

您应该考虑使用像https://regexr.com这样的网站-通过允许您粘贴案例并查看案例的工作方式,它在编写正则表达式方面成倍地发挥作用。

答案 2 :(得分:2)

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

<(。*?)>

答案 3 :(得分:2)

您的模式与示例数据的第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