2014-05-13 42 views
2

试图找到一个字符串最后一个破折号后的数字的最后一个实例,以便正则表达式匹配最后一个破折号后的所有数字?

test-123-2-456将返回456

123-test将返回""

123-test-456将返回456

123-test-456sdfsdf将返回456

123-test-asd456将返回456

表达,@"[^-]*$",虽然不匹配的数字,并且我一直在使用[\ d],但无济于事尝试。

回答

4

当然,最简单的解决办法是这样的:

(\d+)[^-]*$ 

这将一个或多个数字,在组1中捕获的,后面的零或多个其他连字符的任何字符,接着在字符串的末尾。换句话说,只要在该序列和字符串结尾之间没有连字符,它就会匹配任何数字序列。然后您只需从比赛中提取组1。例如:

var inputs = new[] { 
    "test-123-2-456", 
    "123-test", 
    "123-test-456", 
    "123-test-456sdfsdf", 
    "123-test-asd456" 
}; 
foreach(var str in inputs) 
{ 
    var m = Regex.Match(str, @"(\d+)[^-]*$"); 
    Console.WriteLine("{0} --> {1}", str, m.Groups[1].Value); 
} 

产地:

test-123-2-456 --> 456 
123-test --> 
123-test-456 --> 456 
123-test-456sdfsdf --> 456 
123-test-asd456 --> 456 

或者,如果你可以使用一个negative lookahead这样的:

\d+(?!.*-) 

这只要它们是匹配一个或多个数字字符之后没有连字符。只有数字将被包含在比赛中。

请注意,如果在最后一个-之后有两组或更多组数字,则这两个选项的行为会有所不同,例如, foo-123bar456。在这种情况下,您想要发生的事情并不完全清楚,但第一种模式将仅匹配从第一个数字序列开始到结束(123bar456)的所有内容,而第一个组只包含第一个数字序列(123)。如果您想更改此设置以便它只捕获最后一个数字序列,请将\d放在字符类中(即(\d+)[^\d-]*$)。第二个模式将为每个序列数字生成一个单独的匹配项(在本例中为123456),但Regex.Match方法只会给您第一个匹配项。

+0

“测试-123-dfg456” 与上述匹配dfg456 – user1853454

+0

@ user1853454你必须提取第一组,我已经包含了一个例子。但是,我注意到我的原始图案有问题;我在更新的答案中更正了它。 –

+0

多数民众赞成在此非常抱歉是一个痛苦,你可能会解释它有点生病标记为正确答案 – user1853454

0

从这个表达式的最后一组可以得到的最后一个数字为您提供:

var inputs = new[] { 
    "test-123-2-456", 
    "123-test", 
    "123-test-456", 
    "123-test-456sdfsdf", 
    "123-test-asd456" 
}; 


var m = Regex.Match(str, @"([0-9]*)"); 
if(m.Groups.Length>1) //This will avoid the values starting with numbers only. 
    Console.WriteLine("{0} --> {1}", str, m.Groups[m.Groups.Length-1].Value); 

[^-A-z][0-9]+[^A-z] 

如果您正在寻找在团体,你可以通过匹配组得到的最新数字写代码

0

我建议应用两个正则表达式函数。把第一个的结果作为第二个的输入。

第一正则表达式是:

-[0-9]+[^-]+$ // Take the last peace of your string lead by a minus (-) 
       // followed by digits ([0-9]+) 
       // and some ugly rest that doesn't contain another minus ([^-]+$) 

第二正则表达式是:

-[0-9]+   // Seperate the relevant digits from the ugly rest 
       // You know that there can only be one minus + digits part in it 

这里测试:http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

+0

这不适用于'123-test-asd456' –

相关问题