繁体   English   中英

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

[英]Regex to match multiple number groups between two characters

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

<@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+这样的数字

我需要弄清楚如何只获得<>之间的数字,但我一生都无法弄清楚如何。

非常感谢任何帮助!

要仅从给定格式中提取数字,请使用以下正则表达式模式:

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

看到它在行动: https : //regexr.com/3j6ia

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

基于环视的方法

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

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

查看正则表达式演示

(?<=<@!?)是需要<=<=! 紧接在当前位置的左侧, (?=>)是一个正向前瞻,它需要> char 紧靠当前位置的右侧。

捕捉方法

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

<@!?(\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# 演示

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

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

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

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

通过m.Groups["yourgroupname"].Value访问它 - 更多见 fe 如何访问 .NET Regex 中的命名捕获组?

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

详情

(?:)非捕获组

<@中的字符匹配<@字面上

? 匹配零次和一次

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

正则表达式演示

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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM