c# 正则表达式将字符串与 或 [duplicate] 匹配

c# Regex match strings with or [duplicate]

提问人:NubyShark 提问时间:11/14/2023 最后编辑:gunr2171NubyShark 更新时间:11/16/2023 访问量:92

问:

我很难将以下字符串与正则表达式匹配。

dabc _001~1501_ @as2.txt
qbc _001-501_.txt
bbc _1~501_.txt
abc 1-501.txt

我想要正则表达式匹配组 1 的结果如下:

001~1501
001-501
1~501
1-501

我试过了,但它只能匹配 1-501 或 1~501 或 1501。@".*(\d{1,4}..\d{1,4})"

C# 正则表达式

评论

2赞 Flydog57 11/14/2023
这两个数字总是用波浪号还是破折号分隔?为什么不在数字分组之间使用呢?您的问题可能是数字分组之间的点点 () ;这将匹配两个字符,而不是一个[~-]..
0赞 Tim Roberts 11/14/2023
你为什么要使用而不是你真正想要的?..-
0赞 NubyShark 11/14/2023
有时情节用 - 或 ~ 甚至 _ 分隔。所以小说的第 1-120 集可以是 1_120 或 1~120。
0赞 Flydog57 11/14/2023
因此,请使用(括号表示其中之一[~_-])
0赞 NubyShark 11/14/2023
啊,是的!谢谢它有效。是否可以在 001 前面匹配 00?nvm 添加 ?之后 .* 让它工作 谢谢大家。

答:

1赞 gunr2171 11/14/2023 #1

.*贪婪的匹配。如果您有输入

dabc _001~1501_ @as2.txt

该模式将从匹配任何内容开始,尽可能多地匹配,直到它能够满足下一个符号。下一个是 ,您希望最多有四个字符长,但这不是必需的。\d{1,4}

因此,将与 匹配,留下“1~”作为捕获组的开头,如您在结果中看到的那样。dabc _00.*

通过添加一个 after..*?

.*?(\d{1,4}..\d{1,4})

既然您知道为什么会给您带来问题,那么接下来让我说您甚至不需要它。以你的模式的当前形式,并没有真正贡献任何东西。有它实际上与没有它在模式中是一样的。除非您事先添加匹配项,例如字符串锚点 () 或其他内容的开头,否则它没有任何用处。.*.*?.*?^


您可能还想解决模式中间的问题。这匹配任意两个字符,由 .这意味着,如果分隔符后面的数字是个位数,您将遇到问题,因为第二个句点将与唯一的数字匹配,而没有留下任何可以匹配的数字。请考虑使用代替 ...\d{1,4}\d[-~_]..

评论

0赞 Cary Swoveland 11/14/2023
为什么不只是 ?有什么影响吗?(\d{1,4}..\d{1,4}).*?
0赞 Reilas 11/14/2023 #2

下面是一个匹配模式

(?<=[ _])\d+\D\d+(?=[_.])

而且,这是一个捕获模式

[ _](\d+\D\d+)[_.]

关于你的模式,尝试使用惰性量词

.*?(\d{1,4}..\d{1,4})