我有一个如下所示的字符串:
<@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+
我需要弄清楚如何只获取<
和>
之间的数字,但我不能为我的生活找出方法。
非常感谢任何帮助!
答案 0 :(得分:2)
在C#中,您可以使用两种方法:基于(因为后视模式可以是可变宽度)和捕获组方法的外观。
可以轻松帮助您在正确的上下文中获取数字的模式是
(?<=<@!?)\d+(?=>)
请参阅regex demo
(?<=<@!?)
是一个积极的外观,需要<=
或<=!
紧靠当前位置的左侧,而(?=>)
是一个需要{{1}的正面预测} char立即位于当前位置的右侧。
您可以使用以下模式捕获预期>
子字符串中的数字:
<...>
<强>详情
<@!?(\d+)>
- 文字<@
子字符串<@
- 可选的惊叹号!?
- 捕获与一个或多个数字匹配的第1组(\d+)
- 文字>
。请注意,您可以通过>
访问所需的值,如上面的代码段所示。
用法:
match.Groups[1].Value
请参阅C# demo。
答案 1 :(得分:1)
答案 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])
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();