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

标签 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+ 的数字。

我需要弄清楚如何只获取 < 之间的数字和 >但我一辈子都想不通。

非常感谢任何帮助!

最佳答案

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

基于环视的方法

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

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

参见 regex demo

(?<=<@!?)是一个积极的回顾,需要 <=<=!立即在当前位置的左侧和(?=>)是一个积极的前瞻,需要 >立即在当前位置右侧的字符。

捕获方法

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

<@!?(\d+)>

详情

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

请注意,您需要的值可以通过 match.Groups[1].Value 访问如上面的代码片段所示。

用法:

var userDic = new Dictionary<string, string> {
        {"399969178745962506", "One"},
        {"104729417217032192", "Two"}
    };
var p =  @"<@!?(\d+)>";
var s = "<@399969178745962506> hello to <@!104729417217032192>";
Console.WriteLine(
    Regex.Replace(s, p, m => userDic.ContainsKey(m.Groups[1].Value) ?
        userDic[m.Groups[1].Value] : m.Value
    )
); // => One hello to Two
// Or, if you need to keep <@, <@! and >
Console.WriteLine(
    Regex.Replace(s, @"(<@!?)(\d+)>", m => userDic.ContainsKey(m.Groups[2].Value) ?
        $"{m.Groups[1].Value}{userDic[m.Groups[2].Value]}>" : m.Value
    )
); // => <@One> hello to <@!Two>

参见 C# demo .

关于c# - 正则表达式匹配两个字符之间的多个数字组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48253155/

相关文章:

c# - 使用 Roslyn 向 C# 类添加自定义属性

c# - 未初始化的结构成员是否保证有值?

c# - Linq 与可空 int 的 sum

c# - 如何使用 ASP.Net MVC 路由来路由图像?

c# - 始终在玩家面前显示对象

c# - 队列保持引用或对象值?

c# - 在 C# Windows 窗体中预览 .doc、.docx

java - 句子中的每个单词大写字母

c# - 如何为正则表达式指定可选字符?

java - 非捕获组是否多余?