正则表达式匹配两个字符之间的多个数字组

时间:2018-01-14 19:06:35

标签: c# .net regex

我有一个如下所示的字符串:

<@399969178745962506> hello to <@!104729417217032192>

我有一个字典,其中包含以下内容:

{"399969178745962506", "One"},
{"104729417217032192", "Two"}

我的目标是将<@399969178745962506>替换为该数字键的值,在本例中为One

Regex.Replace(arg.Content, "(?<=<)(.*?)(?=>)", m => userDic.ContainsKey(m.Value) ? userDic[m.Value] : m.Value);

我目前的正则表达式如下:(?<=<)(.*?)(?=>)仅匹配<>之间的所有内容,在这种情况下会同时保留@399969178745962506@!104729417217032192

我无法忽略@符号,因为每次都不会出现!符号。因此,仅使用\d+

之类的数字获取数字可能是最佳的

我需要弄清楚如何只获取<>之间的数字,但我不能为我的生活找出方法。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:2)

在C#中,您可以使用两种方法:基于(因为后视模式可以是可变宽度)和捕获组方法的外观。

基于回顾的方法

可以轻松帮助您在正确的上下文中获取数字的模式是

(?<=<@!?)\d+(?=>)

请参阅regex demo

(?<=<@!?)是一个积极的外观,需要<=<=!紧靠当前位置的左侧,而(?=>)是一个需要{{1}的正面预测} char立即位于当前位置的右侧。

捕获方法

您可以使用以下模式捕获预期>子字符串中的数字:

<...>

<强>详情

  • <@!?(\d+)> - 文字<@子字符串
  • <@ - 可选的惊叹号
  • !? - 捕获与一个或多个数字匹配的第1组
  • (\d+) - 文字>

请注意,您可以通过>访问所需的值,如上面的代码段所示。

用法:

match.Groups[1].Value

请参阅C# demo

答案 1 :(得分:1)

要仅提取您给定格式的数字,请使用此正则表达式模式:

(?<=<@|<@!)(\d+)(?=>)

看到它的实际应用:https://regexr.com/3j6ia

答案 2 :(得分:0)

您可以使用非捕获组将所需模式的部分排除在组内:

(?<=<)(?:@?!?)(.*?)(?=>)

另外,您可以命名内部组并使用命名组来获取它:

(?<=<)(?:@?!?)(?<yourgroupname>.*?)(?=>)

通过m.Groups["yourgroupname"].Value访问它 - 更多请参阅f.e. How do I access named capturing groups in a .NET Regex?

答案 3 :(得分:0)

正则表达式(?:<@!?(\d+)>)

<强>详情:

(?:)非捕获组

<@匹配字符&lt; @ literally

?匹配0到1次

(\d+)第一个捕获组\d+匹配一个数字(等于[0-9])

Regex demo

string text = "<@399969178745962506> hello to <@!104729417217032192>";
Dictionary<string, string> list = new Dictionary<string, string>() { { "399969178745962506", "One" }, { "104729417217032192", "Two" } };

text = Regex.Replace(text, @"(?:<@!?(\d+)>)", m => list.ContainsKey(m.Groups[1].Value) ? list[m.Groups[1].Value] : m.Value);

Console.WriteLine(text); \\ One hello to Two
Console.ReadLine();