V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ibudao
V2EX  ›  Node.js

请教一个 JavaScript 的正则问题

  •  
  •   ibudao · 2014-04-15 11:37:43 +08:00 · 4693 次点击
    这是一个创建于 3875 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Str='we Name: ects\nYou Name: deee'
    期望输出: ['ects, 'deee']
    由于JS不支持零宽后顾断言,这个地方我用分组:
    `Str.match(/(Name:\s*([a-z]+\b)\2)/g);`
    但是输出是`null`,换用不捕获的分组写法:
    `Str.match(/(?:Name:\s*)[a-z]+\b/g);`,也不是我想要的输出。
    我是在nodejs上跑的,求大神指导!
    21 条回复    1970-01-01 08:00:00 +08:00
    s
        1
    s  
       2014-04-15 11:50:58 +08:00   ❤️ 1
    var ans=[];
    str.replace(/Name:\s*([a-z]+)\b/g, function(_, name){
    ans.push(name);
    });
    muzuiget
        2
    muzuiget  
       2014-04-15 11:54:43 +08:00
    为什么要纠结一条正则,先 split('\n') 然后分两次提取不就好了吗?
    ibudao
        4
    ibudao  
    OP
       2014-04-15 12:24:49 +08:00
    @muzuiget 其实这里我不太明白的是,为什么通过\N来提取第N个捕获为啥不生效。。
    khowarizmi
        5
    khowarizmi  
       2014-04-15 12:25:24 +08:00
    lss +1
    ibudao
        6
    ibudao  
    OP
       2014-04-15 12:25:43 +08:00
    @s 我表示我长姿势了,OTZ!!
    ibudao
        7
    ibudao  
    OP
       2014-04-15 12:28:24 +08:00
    @khowarizmi 恩,那个貌似是正解,不过只能这样曲折了吗。。
    jakwings
        8
    jakwings  
       2014-04-15 12:44:04 +08:00
    1 楼的代码差不多了。假如是经常出现这种需求的话,干脆用 YAML 函数库,或者自己写一个简化版通用函数好了。
    exoticknight
        9
    exoticknight  
       2014-04-15 12:46:04 +08:00
    捕获分组其实是可以的,你只要取[1]分组就可以了
    ibudao
        10
    ibudao  
    OP
       2014-04-15 12:49:32 +08:00
    @exoticknight 针对我这个情况,那[1]取分组如何写?
    rubyking
        11
    rubyking  
       2014-04-15 15:27:44 +08:00   ❤️ 1
    Str.match(/\w+$/mg);
    ibudao
        12
    ibudao  
    OP
       2014-04-15 15:33:18 +08:00
    实际上我的源string是这样的:
    Available Android Virtual Devices:
    Name: test
    Path: /home/kingbo/.android/avd/test.avd
    Target: Android 4.4 (API level 19)
    ABI: armeabi-v7a
    Skin: WVGA800
    ---------
    Name: ects
    Path: /home/kingbo/.android/avd/ects.avd
    Target: Android 4.4 (API level 19)
    ABI: armeabi-v7a
    Skin: WVGA800
    ibudao
        13
    ibudao  
    OP
       2014-04-15 15:34:01 +08:00
    @rubyking 见上楼
    xu33
        14
    xu33  
       2014-04-15 19:22:25 +08:00 via iPhone
    使用regexp对象
    switch
        15
    switch  
       2014-04-15 21:21:51 +08:00
    可以先使用 match 提取出 Name: xxx 后再使用 replace 替换掉 Name: ,如:
    ```
    Str.match(/Name:\s*(\w+)/g) || []).map(function (str) {
    return str.replace(/Name:\s*/, "");
    }
    ```
    match 方法的正则里如果有 g(全局匹配)则分组引用无效了。
    shiye515
        16
    shiye515  
       2014-04-16 12:01:02 +08:00
    Str.match(/(: *).*(?=($|\n))/g).map(function(v){return v.replace(/: */,'')}),现学现卖,参考http://deerchao.net/tutorials/regex/regex.htm , http://www.cnblogs.com/rubylouvre/archive/2010/03/09/1681222.html ,javascript不支持后瞻,要不后面的map都可以省了
    shiye515
        17
    shiye515  
       2014-04-16 12:05:24 +08:00
    @rubyking 这个匹配简洁明了
    shiye515
        18
    shiye515  
       2014-04-16 12:14:08 +08:00
    请原谅我回帖不看之前的回复 `Str.match(/(Name: *).*(?=($|\n))/g).map(function(v){return v.replace(/Name: */,'')}) `这个应该符合要求
    ibudao
        19
    ibudao  
    OP
       2014-04-16 12:27:51 +08:00
    @shiye515 谢谢分享。貌似js不支持后顾,这个需求就没法一个匹配搞定了
    s
        20
    s  
       2014-04-16 17:15:27 +08:00
    Str.match(/[^:]+$/mg);
    exoticknight
        21
    exoticknight  
       2014-04-27 01:04:14 +08:00
    v2ex的提醒系统完全没提示……
    var re = /Name:\s*([a-z]+\b)/g,match;
    match = re.exec( Str );
    while ( match != null ) {
    console.log( match[1] ); // or whatever else
    match = re.exec( Str );
    }
    @ibudao
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2816 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:24 · PVG 15:24 · LAX 23:24 · JFK 02:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.