如何使用正则表达式提取字符串

时间:2017-08-28 11:56:19

标签: c# asp.net regex

我的字符串包含一些与#<>分隔的值,我需要使用正则表达式获取所有值。 数据样本是:

#4<...>

以下你可以看到主字符串的例子:

string s = "#0<Every word comes here>#1<...>#2<...>#3<...>#4<...>#5<...>#6<...>#7<...>#8<...>#9<...>#A<...>#B<...>#C<...>#D<...>#E<...>#F<...>";

3 个答案:

答案 0 :(得分:2)

string str = "#0<Every word comes here>#1<...>#2<...>#3<...>#4<...>#5<...>#6<...>#7<...>#8<...>#9<...>#A<...>#B<...>#C<...>#D<...>#E<...>#F<...>";
var regex = new Regex(@"(?s)\#\d<(.+?)>");
foreach (Match match in regex.Matches(str))
{
    var value = match.Value;
    var words = match.Groups[1].Value;
}

答案 1 :(得分:0)

如果您确实希望获得#4&lt; ...&gt;然后用这个:

    #4(.+?)>

或者,如果你想要所有#x&lt; ...&gt;然后用这个:

    #[1-9A-Z](.+?)>

这应该是最简单的解决方案。

答案 2 :(得分:0)

短版

使用#(?<key>[0-9A-F])<(?<tag>.*?)>并按实际名称访问keytag个命名组:

var regex = new Regex("#(?<key>[0-9A-F])<(?<tag>.*?)>");

var matches=regex.Matches(s);
foreach (Match match in matches)
{
    Console.WriteLine("{0} {1}", match.Groups["key"].Value, match.Groups["tag"].Value);
}

长解释

正则表达式功能强大但不易于使用,如果不了解它们的工作方式。 .NET文档包含一个关于正则表达式的非常好的部分,包括Quick Reference

首次尝试是捕捉<>之间的所有内容。要捕获任何单个字符,请使用.。要捕获.等模式的0个或多个实例,请使用*。一个或多个匹配+

首次尝试是使用<.*>。但这会失败并捕获从第一个<到最后一个>的所有内容。这是因为正则表达式默认使用贪婪匹配 - 它们捕获尽可能多的匹配字符。

要捕捉尽可能少的字符,即使用非贪婪匹配,应在?*之后添加符号+。模式<.*?>将为每个< >对及其内容返回一个匹配项。

但不需要标签。我们可以将每个标记内的字符分组,而不是使用字符串操作来清除匹配,因此我们可以将它们作为单个组进行访问。这是通过用括号括起模式来完成的,例如<(.*?)>。分组在Grouping Constructs in Regular Expressions

中有详细描述

可以命名组,这样可以更轻松地读取所需的值 lot 。这些组被称为&#34;命名组&#34;。通过在左括号后添加?<somename>来定义命名组。

可以使用以下格式将标记内容捕获到tag组中:<(?<tag>.*?)>

使用命名组时,捕获密钥很容易。密钥可以由模式#(?<key>.)捕获。这可能会捕获可能无效的密钥,例如#Z。要仅匹配特定的字符集,可以通过将所有字符放在方括号内来定义字符组,例如[12A]。范围也可以使用。要匹配字符0-9和A-G,该组必须为[0-9A-F]

捕获键和值并在命名组中返回它们的完整模式是:

#(?<key>[0-9A-F])<(?<tag>.*?)>

可以使用Match.Groups属性

按名称访问命名组

一个例子:

var s = "#0<Every word comes here>#1<...>#2<...>#3<...>#4<...>#5<...>#6<...>#7<...>#8<...>#9<...>#A<...>#B<...>#C<...>#D<...>#E<...>#F<...>";
var regex = new Regex("#(?<key>[0-9A-F])<(?<tag>.*?)>");

var matches=regex.Matches(s);
foreach (Match match in matches)
{
    Console.WriteLine("{0} {1}", match.Groups["key"].Value, match.Groups["tag"].Value);
}

命名组允许使用LINQ来处理匹配,过滤它们并生成,例如键/值对的字典,例如:

var pairDictionary = (from Match match in regex.Matches(s)
                      let pair= new { Key   = match.Groups["key"].Value, 
                                      Value = match.Groups["tag"].Value
                                    }
                      where pair.Key != "A"
                      select pair
                     ).ToDictionary(pair=>pair.Key, pair=>pair.Value);