如何修复此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
我希望这匹配如下字符串:
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]"
捕获组返回的内容如下:
$1 = header_0000000602_ $2 = _mc2e1nrobr1a3s55niyrrqvy_20081212 $3 = .doc
如果没有找到文件扩展名,$ 3可以为空.$ 3是可选部分,如上面的str3所示.
如果我加"?" 到第三个捕获组"(.\ w {3,4})?"结束时,RegEx不再为任何字符串捕获3美元.如果我添加"+"而不是"(.\ w {3,4})+",则RegEx根本不再捕获str3,这是预期的.
我觉得用"?" 在第三个捕获组的末尾是适当的事情,但它不能像我期望的那样工作.对于我用来忽略字符串部分的".*"部分,我可能太天真了.
不按预期工作:
.*(header_\d*_).*(_.*_.{8}).*(\.\w{3,4})?.*
Sean Bright.. 5
一种可能性是倒数第二个.*
是贪婪的.您可以尝试将其更改为:
.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.* ^ Added that
这不正确,这个将匹配您提供的输入,但它假定.
它遇到的第一个是文件扩展名的开头:
.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*
编辑:删除我在第二个正则表达式中的转义.
一种可能性是倒数第二个.*
是贪婪的.您可以尝试将其更改为:
.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.* ^ Added that
这不正确,这个将匹配您提供的输入,但它假定.
它遇到的第一个是文件扩展名的开头:
.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*
编辑:删除我在第二个正则表达式中的转义.