尝试在字符串中最后一个破折号后找到最后一个数字实例
test-123-2-456
会返回456
123-test
会返回""
123-test-456
会返回456
123-test-456sdfsdf
会返回456
123-test-asd456
会返回456
表达式@"[^-]*$"
虽然与数字不匹配,但我尝试使用[\ d]但无效。
答案 0 :(得分: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
)的所有内容,其中第1组仅包含第一个序列数字(123
)。如果您想要更改它以便它只捕获最后一个数字序列,请在字符类中放置\d
(即(\d+)[^\d-]*$
)。第二个模式将为每个序列数字生成单独的匹配(在此示例中为123
和456
),但Regex.Match
方法仅为您提供第一个匹配。
答案 1 :(得分:0)
此RegEx的最新群组可以为您获取最后一个号码:
[^-A-z][0-9]+[^A-z]
如果您正在查看群组,可以通过匹配群组来编写此代码以获取最新的数字:
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);
答案 2 :(得分: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