【问题标题】:Why is this regex expression returning 'true'? [duplicate]为什么这个正则表达式返回“真”? [复制]
【发布时间】:2019-05-30 10:03:50
【问题描述】:

我在 RegularExpressionValidator 中使用了这个精确的正则表达式,它工作正常。但是,c# 中的此代码返回 true。你能告诉我我做错了什么吗?

我只检查数字正则表达式

var x = Regex.IsMatch("1234asdf", @"[0-9]+").ToString();

【问题讨论】:

  • 当然返回true。为什么不应该呢?我不知道您在提到什么 RegularExpressionValidator,但也许 RegularExpressionValidator 有一个设置(已启用),使其将正则表达式锚定到字符串的开头和结尾......
  • 它匹配是因为Regex.IsMatch API 试图在输入字符串的 any 部分中找到匹配的模式。如果要强制整个字符串输入匹配,请使用模式^[0-9]+$。这将匹配仅由数字组成的输入。
  • 因为它只会匹配数字。你还没有告诉它匹配整个字符串。
  • [0-9]+ 表示“一位或多位数字”,我们有 1234 匹配模式;你的意思是"^[0-9]+$" 模式? (一位或多位仅限
  • RegularExpressionValidator 如果您自己没有锚定,则会添加锚定。它将确保没有与正则表达式不匹配的字符。为了自己做,你必须添加锚,正如@Tim所说。

标签: c# regex


【解决方案1】:

因为在提供的字符串中找到您要查找的内容。 您可以使用 ^$ 强制整个字符串对正则表达式进行数学运算:

^[0-9]+$

^ 匹配字符串的开头、$、结尾

请查看此文档的锚点部分:Regular Expression Language - Quick Reference

顺便说一句,您应该使用 \d 而不是 [0-9]

【讨论】:

  • 值得一提的是为什么RegularExpressionValidator 不需要正则表达式锚定,因为这是问题的一半?
  • 旁注:在 c# 中,\d 表示任何 unicode 数字(例如,波斯数字),[0-9] 通常更安全选项;或者写成Regex.IsMatch("1234asdf", @"^\d+$", RegexOptions.ECMAScript);
  • 没有RegularExpressionValidator。这是Regex类的静态方法,完全没有配置:docs.microsoft.com/en-us/dotnet/api/…
  • 我假设他正在使用 System.Web 中的那个:docs.microsoft.com/en-us/dotnet/api/…
  • @canton7 我什么都不假设:我正在阅读代码并且我清楚地阅读了Regex.IsMatch。这就是我包含参考链接的方法。对不起,但你的假设是错误的;)
【解决方案2】:

其他答案讨论了为什么需要锚定您的正则表达式。但是,没有人回答您问题的 RegularExpressionValidator 部分。

我假设您的意思是System.Web.RegularExpressionValidator。 RegularExpressionValidator 不仅仅检查正则表达式是否匹配——它还检查正则表达式是否完全匹配。也就是说,它有效地为您添加了^$ 锚定。

The code:

Match m = RegexUtil.Match(controlValue, ValidationExpression, RegexOptions.None, MatchTimeout);
return(m.Success && m.Index == 0 && m.Length == controlValue.Length);

注意它如何检查m.Success,但也检查匹配是否从被检查值的开头开始,并在被检查值的结尾结束。

System.ComponentModel.DataAnnotations.RegularExpressionAttribute 做同样的事情)。

【讨论】:

    【解决方案3】:

    因为您试图匹配从 0 到 9 的一个或多个数字。请说明:

    [0-9] //Match digit 0-9 you can also use /d-(Match any digit char)
    + //Match one or more of the preceding token
    

    如果你的字符串中有一些数字,这个代码:

    var x = Regex.IsMatch("1234asdf", @"[0-9]+").ToString();
    

    将始终返回 True。 例如,如果你试试这个:

    var x = Regex.IsMatch("asdf", @"[0-9]+").ToString();
    

    将返回 False

    【讨论】:

      【解决方案4】:

      你必须使用 ^ 和 $ 来强制整个字符串匹配正则表达式模式

      ^[0-9]+$

      ^ 匹配字符串的开头,$ 匹配字符串的结尾

      在 C# 中编写如下格式的表达式:

      var x = Regex.IsMatch("1234", @"^[0-9]+$").ToString();
      

      【讨论】:

      • 尝试为您的答案添加解释
      猜你喜欢
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2020-11-27
      • 2018-06-02
      相关资源
      最近更新 更多