Fork me on GitHub
代码改变世界

关于C#判断是否是数字的正则式

2016-03-11 18:57  沉睡的木木夕  阅读(2762)  评论(0编辑  收藏  举报

  有话要说

    今天我同事突然让我帮他看个问题,他说想不通为什么数据库中会有不合法的内容,我都已经用正则过滤了,并且在本地调通了的!

    我问他是不是你正则有问题,他说没问题啊,前端和后端的正则是一样的,前端我测了的确是可以过滤的!我帮他查看了正则式的确都是一样的,并且在生产环境中的确也是有过滤作用的!但的确数据库中有不合法的内容(至于是什么内容,咱们往下看 ^-^)

  判断目标内容是否为数字

    我们来说说,判断是否为数字的正则式,或者说判断手机号码的合法性,下面直接给出网上的一段代码(还是有很多同学都用到了);正则式如下:

    var partner = /^(013|014|015|017|018|13|14|15|17|18)\d{9}$/ 

    或者判断几位的数字

    var partner2 = /^\d{x}$/

    其中的 \d 是判断是否为数字的核心,我们在运用js的时候,的确能给我们正确的结果没错!但是,这就能万无一失的在另一个不同的平台上用么(.NET);有朋友觉得奇怪:难道不是一致的么?

  .NET下正则式和JS的正则式是有差异的

    是不是,我们直接用代码证明:

    private readonly Regex MobilePhone = new Regex(@"^\d{9}$");

    bool result = MobilePhone.IsMatch("123456789");

    bool result2 = MobilePhone.IsMatch("123456789");

    那么result result2分别是true or false?

    .

    .

    .

    没错,我同事遇到就是数字的全角和半角差别导致不合法的数据进入了我们的数据库!进而在db那边统计的时候出了问题

    有朋友也许会问“既然是这样,前端也会验证啊!”这种问题我就不作答了

    这里我给出网上另一种验证方法,可以解决这种不同语言(平台)的正则漏洞

    var correct = /^[0-9]/

    把核心的\d 换成 0-9这样就没问题了

    至于为什么出这样的差异,很遗憾我答不上来! 我依稀记得,在《正则表达式经典实例》这本书中说不同语言下的正则采用的行为原则是不同的

    好吧,我也只能给出这种不算答案的答案了