[英]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+
这样的数字
我需要弄清楚如何只获得<
和>
之间的数字,但我一生都无法弄清楚如何。
非常感谢任何帮助!
在 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.