我有一个如下所示的字符串:
<@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/