如何修复此RegEx以选择性地捕获文件扩展名?
我试图将字符串与可选组件匹配,但似乎有些错误.(匹配的字符串来自打印机日志.)
我的RegEx(.NET Flavor)如下:
.*(header_\d{10,11}_).*(_.*_\d{8}).*(\.\w{3,4}).*
-------------------------------------------
.* # Ignore some garbage in the front
(header_ # Match the start of the file name,
\d{10,11}_) # including the ID (10 - 11 digits)
.* # Ignore the type code in the middle
(_.*_\d{8}) # Match some random characters, then an 8-digit date
.* # Ignore anything between this and the file extension
(\.\w{3,4}) # Match the file extension, 3 or 4 characters long
.* # Ignore the rest of the string
Run Code Online (Sandbox Code Playgroud)
我希望这匹配如下字符串:
str1 = "header_0000000602_t_mc2e1nrobr1a3s55niyrrqvy_20081212[1].doc [Compatibility Mode]"
str2 = "Microsoft PowerPoint - header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1].txt"
str3 = "header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1]"
Run Code Online (Sandbox Code Playgroud)
捕获组返回的内容如下:
$1 = header_0000000602_
$2 = _mc2e1nrobr1a3s55niyrrqvy_20081212
$3 = .doc
Run Code Online (Sandbox Code Playgroud)
如果没有找到文件扩展名,$ 3可以为空.$ 3是可选部分,如上面的str3所示.
如果我加"?" 到第三个捕获组"(.\ w {3,4})?"结束时,RegEx不再为任何字符串捕获3美元.如果我添加"+"而不是"(.\ w {3,4})+",则RegEx根本不再捕获str3,这是预期的.
我觉得用"?" 在第三个捕获组的末尾是适当的事情,但它不能像我期望的那样工作.对于我用来忽略字符串部分的".*"部分,我可能太天真了.
不按预期工作:
.*(header_\d*_).*(_.*_.{8}).*(\.\w{3,4})?.*
Run Code Online (Sandbox Code Playgroud)
一种可能性是倒数第二个.*
是贪婪的.您可以尝试将其更改为:
.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.*
^ Added that
Run Code Online (Sandbox Code Playgroud)
这不正确,这个将匹配您提供的输入,但它假定.
它遇到的第一个是文件扩展名的开头:
.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*
Run Code Online (Sandbox Code Playgroud)
编辑:删除我在第二个正则表达式中的转义.
归档时间: |
|
查看次数: |
9922 次 |
最近记录: |