2012-02-14 117 views
0

我有一組複雜的文件編號,需要使用Regex進行如下過濾。正則表達式在截尾處截斷字符串

E/T66/2004Q/2009AA   --- remove 'AA' ==> E/T66/2004Q/2009 
E/T66/2004Q/2001 Vol1  --- remove ' Vol1' ==> E/T66/2004Q/2001 
E/T66/2004Q/2001Vol1  --- remove 'Vol1' ==> E/T66/2004Q/2001 
E/T66/2004/123/3/1999 Pc3 --- remove ' pc3' ==> E/T66/2004/123/3/1999 
E/T78/2004A    --- remove 'A'  ==> E/T78/2004 

我已經使用這個正則表達式到目前爲止([^/d] + $)到最後部分後的最終「/」 我需要從其中一個非數字是在發現字符串的結尾去除匹配字符串的結尾。

在此先感謝您的時間!

+0

使用'Regex.Replace()' – 2012-02-14 14:41:49

+1

「result」字符串的末尾是否總是有4位數字? – 2012-02-14 14:42:10

+0

@MarcB:它有關係嗎?當然,正則表達式的一半樂趣不用擔心 - 你可以告訴它有任意數量的數字,然後匹配被要求的第一個非數字...... – Chris 2012-02-14 14:59:52

回答

0

感謝您的反饋意見。我已經嘗試過所有這些,並且從你身上學到了很多東西!我最終在這裏使用了「。*/\ d +」選項。

3

使用該刪除的項目,你不想(\D+\d*)$

這裏是它的工作的例子: http://jsfiddle.net/BzyUL/4/

+0

你可以做得更多一點。目前,如果他達到vol10,這將失敗。同樣如果有「第1a卷」。這些可能是不可能的,但它被要求刪除非數字後的所有內容,所以我原以爲\ D +。*?$會爲你做很多...另外我認爲你的\ s?這是多餘的,因爲在我相信它之後,\ D +可以很容易地捕獲空白。 – Chris 2012-02-14 15:20:03

+0

克里斯,好好打電話給多餘的?我沒有想到「Vol」會達到2位或更多位數。 – used2could 2012-02-14 15:26:27

+0

看看有多清潔!我喜歡協作工作!我覺得 」?「在你的建議中跟隨」*「是不需要的,你的想法是什麼? – used2could 2012-02-14 15:30:05

0

如果總有4位數字的末尾,則/(^.+\/\d\d\d\d)/將你的零件匹配想要保留所有的例子。所以只需匹配模式,然後用匹配的字符串替換字符串。

/(^.+\/\d{4})/有一個更短的版本給你。

3

我本來認爲用你想要保留的東西而不是你想失去的東西來定義它更容易。

.*/\d+ 

上面將匹配所有字符,直到達到幷包括最終/,然後任意數量的數字。當它到達第一個非數字字符時,這個匹配將停止,這是你要開始扔東西的地方。

示例代碼:

var re = new Regex("(.*/\\d+).*"); 
Console.WriteLine(re.Replace("E/T78/2004A", "$1")); 

這適用於所有上述的例子。

+0

這並不代表以A或AA結尾的項目,但我同意,我認爲他需要在他想要保留的信息的文件名中找到一個模式 – used2could 2012-02-14 15:00:18

+0

@ used2could:對於上面以A或AA結尾的例子,它工作正常。您認爲問題出在哪裏? – Chris 2012-02-14 15:06:51

+0

對於我評論時的遺憾,只有「。*/\ d +」模式。然而,你的例子很好用! – used2could 2012-02-14 15:14:33

0

使用這個正則表達式匹配的完整路徑或文件名只(沒有區別):

((\w+\/)*\d{4})(.*) 

$1替換爲:

var regexp = new Regex(@"((\w+\/)*\d{4})(.*)"); 
string result = regexp.Replace(path, "$1")); 

後刪除不想要的字符年份數字。