我的文件名可以包含任意数量的单词/空格。基本上,我需要正确的语法来使用字符串中间的任何字符而不使用最后一个单词。
一些问题背景 - 第一个词或最后一个词可能是我需要捕捉的日期。或者,最后一个词可以是首字母。我需要命名捕获组中的日期/首字母。
示例文件,
FileName Expected Capture Groups
-------- ----------------------
Myfile 120101.xls Date: {Myfile, 120101}
120101 MyFile.xls Date: {Myfile, 120101}
MyFile BHO.doc Date: {Myfile} Initials: {BHO}
120101 My file name BHO.docx Date: {120101} Initials: {BHO}
Foo.bar None
WhyDidIUsePeriods.huh.doc None
120101 WhyDidIUsePeriods.huh.doc Date: {WhyDidIUsePeriods, 120101}
WhyDidIUsePeriods BHO.huh.doc Date: {WhyDidIUsePeriods} Initials: {BHO}
120101 WhyDidIUsePeriods BHO.huh.doc Date: {120101} Initials: {BHO}
到目前为止,我有以下正则表达式:
@"^(?<Date>.+?(?= ))?.*?((?<Initials>(?<= )[^0-9]*?)|(?<Date>(?<= ).*?))?\..*?$"
这适用于两个字长的文件名,但不适用于更大的文件名(尾随组捕获多个单词)。问题是.*?
在第一个 Date 捕获组之后。我需要这个来贪婪地捕捉所有“内部”词而不消耗最后一个词。我正在考虑负前瞻,但我不确定如何构造它,以便模式既消耗所有字符又不消耗与某个负前瞻模式匹配的字符( .*?\.)
。
(日期捕获组可以捕获非日期,稍后会有自定义解析逻辑)
我想要的东西是否可以通过负面的前瞻来实现?是否有更好的策略来满足这些要求?
编辑:
我已经说明了每个文件示例旁边的预期结果。我不想要任何更具体的日期正则表达式,因为它也可能是各种非数字格式。
不幸的是,Regex 是必要的,因为在某些情况下,问题.*?
将被更具体的模式替换(例如,假设某些文件还需要包含单词“Foo”,Regex 似乎是最好的工具)。