试图找到一个字符串最后一个破折号后的数字的最后一个实例,以便正则表达式匹配最后一个破折号后的所有数字?
test-123-2-456
将返回456
123-test
将返回""
123-test-456
将返回456
123-test-456sdfsdf
将返回456
123-test-asd456
将返回456
表达,@"[^-]*$"
,虽然不匹配的数字,并且我一直在使用[\ d],但无济于事尝试。
试图找到一个字符串最后一个破折号后的数字的最后一个实例,以便正则表达式匹配最后一个破折号后的所有数字?
test-123-2-456
将返回456
123-test
将返回""
123-test-456
将返回456
123-test-456sdfsdf
将返回456
123-test-asd456
将返回456
表达,@"[^-]*$"
,虽然不匹配的数字,并且我一直在使用[\ d],但无济于事尝试。
当然,最简单的解决办法是这样的:
(\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-]*$
)。第二个模式将为每个序列数字生成一个单独的匹配项(在本例中为123
和456
),但Regex.Match
方法只会给您第一个匹配项。
从这个表达式的最后一组可以得到的最后一个数字为您提供:
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-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
这不适用于'123-test-asd456' –
“测试-123-dfg456” 与上述匹配dfg456 – user1853454
@ user1853454你必须提取第一组,我已经包含了一个例子。但是,我注意到我的原始图案有问题;我在更新的答案中更正了它。 –
多数民众赞成在此非常抱歉是一个痛苦,你可能会解释它有点生病标记为正确答案 – user1853454