我有文件名,其中可以有任意數量的單詞/空格。基本上,我需要正確的語法來消費字符串中間的任何字符而不消耗最後一個字。正則表達式捕獲文件名中的第一個/最後一個詞
一些問題背景 - 第一個單詞或最後一個單詞可能是我需要捕獲的日期。或者,最後一個詞可能是首字母縮寫。我需要指定捕獲組中的日期/首字母。
示例文件,
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>(?<=).*?))?\..*?$"
本工程爲兩個字長文件名,但不是什麼大(後組捕獲多個話)。問題是在第一個日期捕獲組之後的.*?
。我需要這樣貪婪地捕捉所有「內部」詞彙而不消耗最後一個詞。我在考慮負向預測,但我不確定如何構建它,因此該模式既消耗所有字符,也不消耗匹配某個負向預測模式的字符(.*?\.)
。
(這是確定的日期捕捉組將捕獲非日期,所以定製以後分析邏輯爲)
是我想甚至有可能爲負先行?有更好的策略來滿足這些要求嗎?
編輯:
我說明什麼預期的結果將是每個文件旁邊的例子。我不想在日期中使用更具體的正則表達式,因爲它可能也是各種非數字格式。
不幸的是,正則表達式很有必要,因爲在某些情況下,有問題的.*?
將被替換爲更具體的模式(例如,某些文件需要另外包含單詞「Foo」,正則表達式似乎是最好的工具) 。
你可以從你的文件名發佈你的期望值嗎? – Angga
你如何定義「單詞」?此外,文件名由1個或多個*段*組成('.')。當你說「找到第一個和最後一個單詞」時,這與文件名的分段結構有什麼關係?如果一個文件名由一個單詞組成,該怎麼辦? –
可以假定文件名具有擴展名。我只關心第一部分(在任何時期之前)。一個詞由字符串,空格或句點的開始來界定。 – MgSam