【问题标题】:c# Regex for numbers and dash onlyc# 仅用于数字和破折号的正则表达式
【发布时间】:2012-01-06 16:21:34
【问题描述】:

我的 c# 代码中有以下内容 - 我喜欢它做的是检查表达式是否有数字或破折号,但没有别的。如果我输入字母 K 以及破折号或数字,它仍然会接受它。怎么说呢,快写是数字还是破折号:

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

请注意,输入是我传递给评估的文本。

【问题讨论】:

  • 您的表达式意味着字符串中的某处必须有一个数字或破折号。并不是说它可以包含这些字符而不能包含其他任何内容。

标签: c# regex


【解决方案1】:
Match match = Regex.Match(input, @"^[0-9-]*$");

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

* 表示(仅)0 个或多个数字或破折号应该存在(使用 + 代替 1 个或多个)。

【讨论】:

  • 不应该像这样转义破折号:Match match = Regex.Match(input, @"^[0-9\-]$"); 吗?
  • 不,开头或结尾([] 之间)的破折号是文字破折号,而不是范围字符。
【解决方案2】:

您的正则表达式匹配字符串中存在的 任何 数字或破折号,请尝试以下操作:

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

^ 字符串开头

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

$ 字符串结束

【讨论】:

  • 谢谢,它按我的预期工作。当我输入一个值时,它不接受 9999K。表达式中的什么不接受任何 alpha 值?
  • 如上所述,正则表达式表示字符串的开头和结尾之间只能存在一个或多个数字或破折号。您允许字母通过的原因是因为您只是验证字符串中是否存在数字或破折号。 ^$ 确保我检查的是整个字符串,而不是它的任何匹配的部分。
【解决方案3】:

以下任何正则表达式都可以正常工作。

[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

【讨论】:

  • [\d]+\-*[\d]+ 正是我想要的。
【解决方案4】:

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

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

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

这实际上只适用于一个角色。如果您希望它包含多个字符,例如“123-5”,请将您的正则表达式更改为..

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

【讨论】:

  • 正弦第二个 - 不能是一个范围,没有必要转义它
  • 请注意上面@mynameiscoffey 对您模式中的^$ 的评论。
【解决方案5】:

如果这是一个字符串数组,考虑用 LINQ 完成它吗?

if (arrInput.Any(s => (!Regex.IsMatch(s, @"^[\d-]+$")))){ //OK }

【讨论】:

    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多