V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
laoona
V2EX  ›  JavaScript

javascript 失焦事件,正则验证什么鬼?

  •  
  •   laoona · 2015-08-12 10:28:29 +08:00 · 3674 次点击
    这是一个创建于 3400 天前的主题,其中的信息可能已经有所发展或是发生改变。

    <input type="text" id="txt">
    <script type="text/javascript">
    window.onload = function() {
    var reg = /^[\u4e00-\u9fa5\u22c5\u2022\u00b7]+$/gi,
    txt = document.getElementById("txt");
    txt.onblur = function() {
    console.log(txt.value);
    console.log(reg.test(txt.value)); //false
    }
    }
    </script>
    验证中文、圆点字符,为毛输入框的文本值没变化的情况下:第一次触发验证是true,第二次是false?

    第 1 条附言  ·  2015-08-12 11:05:30 +08:00
    感觉1楼2楼的解答,E文有点渣,有点吃力,看的还不是太明白。javascript正则的g/m/i。只有i是最好理解的。再找找资料,看看g/m。
    11 条回复    2015-08-30 21:20:42 +08:00
    tamamaxox
        2
    tamamaxox  
       2015-08-12 10:49:43 +08:00   ❤️ 1
    /^[\u4e00-\u9fa5\u22c5\u2022\u00b7]+$/ 就好了,没有必要加gi
    flowfire
        3
    flowfire  
       2015-08-12 10:58:32 +08:00   ❤️ 1
    很奇怪你为什么验证中文字符还要加上 不区分大小写 。。。。
    laoona
        4
    laoona  
    OP
       2015-08-12 11:02:49 +08:00
    @flowfire 这个真是习惯加上的,真心不太理解global
    flowfire
        5
    flowfire  
       2015-08-12 11:12:45 +08:00
    @laoona
    i才是不区分大小写。。
    g是匹配所有
    如2楼所说,如果你只是检测这个里面存不存在的话的确没必要加上g
    比如
    "1111".match(/1/)

    "1111".match(/1/g)

    出来的结果分别是
    ['1']

    ['1','1','1','1']
    不加g就是一旦匹配到第一个就停止。。
    加了g就是一直查找直到所有的全部匹配到
    flowfire
        6
    flowfire  
       2015-08-12 11:15:51 +08:00
    刚刚google了一下。。。。m的意思大概就是换行符能被 . 匹配吧。。
    flowfire
        7
    flowfire  
       2015-08-12 11:21:16 +08:00
    点进连接看了一下。。。
    大意是这么回事
    由于 g 是要求查找所有匹配
    所以每次调用并不是每次都取第一个匹配值。。
    而是依次取第一个,第二个,第三个。。知道空。。
    按照你的写法,貌似只能匹配到一个值,
    所以返回的值大概是这样
    返回取到的第一个值 true
    后面没有了,返回空 false
    上一次返回了空,返回取到的第一个值 true
    后面没有了,返回空 false
    leeyuzhe
        8
    leeyuzhe  
       2015-08-12 11:29:33 +08:00
    @flowfire 7楼正解,如果加g就是一次匹配尾部所有符合内容直到匹配到空然后进行下一次从头匹配
    Biwood
        9
    Biwood  
       2015-08-12 13:43:12 +08:00
    经典问题啊,用正则的 test() 测试的时候千万要小心,特别是加上 global 标识符之后,正则对象会记忆上一次的匹配位置,接下来的 test 都是接着上一次成功的位置开始匹配的,你每次执行 test 完之后可以打印 reg.lastIndex 看一下
    iyaozhen
        10
    iyaozhen  
       2015-08-12 14:40:39 +08:00
    @Biwood 我去,还有这种问题呀。受教了
    mingyun
        11
    mingyun  
       2015-08-30 21:20:42 +08:00
    @Biwood 恩 这是个坑
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:47 · PVG 22:47 · LAX 06:47 · JFK 09:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.