我的字符串包含一些与#
和<>
分隔的值,我需要使用正则表达式获取所有值。
数据样本是:
#4<...>
以下你可以看到主字符串的例子:
string s = "#0<Every word comes here>#1<...>#2<...>#3<...>#4<...>#5<...>#6<...>#7<...>#8<...>#9<...>#A<...>#B<...>#C<...>#D<...>#E<...>#F<...>";
答案 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>.*?)>
并按实际名称访问key
和tag
个命名组:
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);