提问人:NubyShark 提问时间:11/14/2023 最后编辑:gunr2171NubyShark 更新时间:11/16/2023 访问量:92
c# 正则表达式将字符串与 或 [duplicate] 匹配
c# Regex match strings with or [duplicate]
问:
我很难将以下字符串与正则表达式匹配。
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})"
答:
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})
评论
[~-]
..
..
-
[~_-]
)