2012-02-14 64 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")); 

后删除不想要的字符年份数字。