C#正则表达式:仅匹配数字和破折号

23

在我的 C# 代码中,我有以下内容 - 我想让它检查表达式是否只包含数字或破折号,如果我输入字母 K 和破折号或数字,它仍然会接受。如何让表达式仅为数字或破折号:

     Match match = Regex.Match(input, @"[0-9-]");
请问需要翻译的内容是什么?

1
你的表达式意味着字符串中必须有数字或破折号。并不是说它只能包含这些字符,而不能包含其他字符。 - Mike Christensen
5个回答

52
Match match = Regex.Match(input, @"^[0-9-]*$");

^ 表示匹配应该从输入的开头开始,$ 表示它应该在输入的结尾结束。

* 表示只应该有0个或更多个数字或破折号(使用 + 代替1个或更多个)。


难道破折号不应该像这样转义吗:Match match = Regex.Match(input, @"^[0-9\-]$"); - Steve B
7
不,起始或结束处方括号中的横杠表示实际的横杠,而非范围字符。 - Hans Kesting

10

你的正则表达式匹配的是字符串中是否存在任意数字或短横线,尝试使用以下表达式:

Regex.Match(input, @"^[\d-]+$");

^字符串开头

[\d-]+一个或多个数字或破折号

$字符串结尾


谢谢,它的工作方式符合我的预期。当我输入一个值时,它不接受例如9999K这样的字母值。在表达式中哪里指示不接受任何字母值? - Nate Pet
如上所述,正则表达式表示字符串的开头和结尾之间只能存在一个或多个数字或破折号。你的正则表达式允许字母通过是因为你只验证了字符串中是否存在数字或破折号。'^'和'$'确保我检查整个字符串,而不是任何部分匹配的字符串。 - mynameiscoffey

8
任何以下正则表达式都可以正常工作。
[0-9\-]+  ( + one or more occurance)

[\d\-]+ (as \d represents numbers)

如果您想要-必须位于数字之间

[\d]+\-*[\d]+ will match any of following
90909900
9090-9009
900--900

如果您希望在数字之间仅使用一个或不使用任何“-”符号,则可以这样做:
[\d]+\-?[\d]+ will match any of following
90909900 pass
9090-9009 pass
900--900 fail

2
[\d]+-*[\d]+ 就是我要找的东西。 - Andrew Grinder

1

你需要转义第二个破折号。

Match match = Regex.Match(input, @"[0-9\-]");

我承认我没有尝试过,但它应该可以工作。

这实际上只适用于一个字符。如果您想要使用多个字符,例如“123-5”,那么请将您的正则表达式更改为...

Match match = Regex.Match(input, @"[0-9\-]+");

1
正弦函数中的“第二个”不能是一个范围,因此无需对其进行转义。 - Rich O'Kelly
请注意@mynameiscoffey在上面评论中提到的模式中的^$ - J Man

0
如果那是一个字符串数组,考虑使用 LINQ 完成?
if (arrInput.Any(s => (!Regex.IsMatch(s, @"^[\d-]+$")))){ //OK }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接