我必须将下面的字符串解析为三个组:Command、Target、Args. 目标和参数都是独立可选的.

/ping@mybot arg1 arg2

在regexr.com的宝贵帮助下,我已经创建了一个正则表达式,并且我在这里获得了正确的匹配.

/(?<Command>[\w]*)+(?:@(?<Target>[\S]*)+)?(?<Args>[\s\S]*)?

enter image description here

然而,当我try 将它插入C#时,我没有得到任何匹配,我会在这里搞砸什么呢?我@"转义字符串以避免转义问题:

var match = Regex.Match(cmd, @"/(?<Command>[\w]*)+(?:@(?<Target>[\S]*)+)?(?<Args>[\s\S]*)?");

C#的正则表达式是否需要一组不同的字符?

enter image description here

推荐答案

您需要将重复捕获的群组转换为简单群组:

/(?<Command>\w+)(?:@(?<Target>\S+))?(?<Args>(?s).*)

请看regex demo.

注我还用.替换了[\s\S],并添加了(?s)行内修饰符选项,以使该修饰符后面的.与包括换行符在内的任何字符匹配.如果在代码中使用RegexOptions.Singleline选项,则可以删除(?s).

请参阅C# demo:

var pattern = @"/(?<Command>\w+)(?:@(?<Target>\S+))?(?<Args>(?s).*)";
var text = "/ping@mybot arg1 arg2";
var match = Regex.Match(text, pattern);
if (match.Success)
{
    Console.WriteLine(match.Groups["Command"].Value);
    Console.WriteLine(match.Groups["Target"].Value);
    Console.WriteLine(match.Groups["Args"].Value);
}

输出:

ping
mybot
 arg1 arg2

Csharp相关问答推荐

使用源生成器,如何使用所有转换后的 node 的聚合生成源?

从C#网站调用时找不到存储过程

MongoDB实体框架核心:表达必须可写

如何告诉自己创建的NuGet包在应用程序中发生了变化?

如何在C#中删除一个特殊字符,如"使用Regex"

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

将轮询与超时同步

应用程序启动器,可 Select 物理屏幕

自动映射程序在GroupBy之后使用项目

Automapper 12.x将GUID映射到字符串

C#带主体的主构造函数?

如何在C#中转换泛型包装类内部的派生类

当我没有此令牌时,为什么语法报告EOF错误?

RX操作员使用先前值进行扫描,信号来自值本身

为什么我的用户界面对象移动到略低于实际目标?

多个选项卡上的MudForm验证

KeyDown从我的文本框中删除输入,如何停止?

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

在Visual Studio 2022中查找Xamarin模板时遇到问题

.NET8支持Vector512,但为什么向量不能达到512位?