我想在C#.NET中用一个常规表达来拆分以逗号分隔的测试字符串. 我知道我可以在这个例子中使用字符串拆分方法,但模式和输入字符串有点复杂,我想保持简单.

模式是这样的:

string pattern = @"(?:^|;)(([^;]*|)(?=;|$))";`

这是测试字符串:

string input = @"text1;text2;text3;;text5";

比赛结果是:

[0] text1
[1] text2
[2] text3
[3] 
[4] text5

这对我来说看起来不错!

但如果我将测试字符串更改为:

string input = @";text2;text3;;text5";

然后我得到这些结果:

[0] 
[1] text3
[2] 
[3] text5

但我期待

[0] 
[1] text2
[2] text3
[3] 
[4] text5

所以我的问题是: 为什么当测试字符串以空字符串开头时,.NET引擎会出现问题? 即使引擎无法返回第一个空字符串,文本2在哪里?或者第一个匹配是空字符串? 我必须更改什么才能让它在C#中工作?

您可以在Regex101上测试它.如果您切换到PCRE 2而不是.NET 7,您会得到预期的结果.

推荐答案

如果省略非捕获组并用回头替换它,似乎可以正常工作:

(?<=^|;)([^;]*)(?=;|$)

Csharp相关问答推荐

发布.NET框架项目将.NET核心元素注入到web. connect中

在Microsoft XNA框架(MonoGame)中旋转相机

错误NU 1301:无法加载源的服务索引

IComponition.获取IReadOnlyCollection的返回默认属性值

在Dapper中使用IasyncEum重写GetAsyncEum方法

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

在多对多关系上不删除实体

C++/C#HostFXR通过std::tuple传递参数

REST API端点中异步后台代码执行的类型

内部接口和类的DI解析

如何在C#中从正则表达式中匹配一些数字但排除一些常量(也是数字)

C#中浮点数的System.Text.Json序列化问题

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

带有列表参数的表达式树

泛型参数在.NET 8 AOT中没有匹配的批注

将操作从编辑页重定向到带参数的索引页

如何避免在.NET中将日志(log)写入相对路径

如何在mediatr命令中访问HttpContext而不安装弃用的nuget包

C#如何获取字符串中引号之间的文本?

Visual Studio,Docker容器-容器调用:连接被拒绝