ibudao
V2EX  ›  Node.js

请教一个 JavaScript 的正则问题

  •  
  •   ibudao · Apr 15, 2014 · 5735 views
    This topic created in 4415 days ago, the information mentioned may be changed or developed.
    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 replies    1970-01-01 08:00:00 +08:00
    s
        1
    s  
       Apr 15, 2014   ❤️ 1
    var ans=[];
    str.replace(/Name:\s*([a-z]+)\b/g, function(_, name){
    ans.push(name);
    });
    muzuiget
        2
    muzuiget  
       Apr 15, 2014
    为什么要纠结一条正则,先 split('\n') 然后分两次提取不就好了吗?
    ibudao
        4
    ibudao  
    OP
       Apr 15, 2014
    @muzuiget 其实这里我不太明白的是,为什么通过\N来提取第N个捕获为啥不生效。。
    khowarizmi
        5
    khowarizmi  
       Apr 15, 2014
    lss +1
    ibudao
        6
    ibudao  
    OP
       Apr 15, 2014
    @s 我表示我长姿势了,OTZ!!
    ibudao
        7
    ibudao  
    OP
       Apr 15, 2014
    @khowarizmi 恩,那个貌似是正解,不过只能这样曲折了吗。。
    jakwings
        8
    jakwings  
       Apr 15, 2014
    1 楼的代码差不多了。假如是经常出现这种需求的话,干脆用 YAML 函数库,或者自己写一个简化版通用函数好了。
    exoticknight
        9
    exoticknight  
       Apr 15, 2014
    捕获分组其实是可以的,你只要取[1]分组就可以了
    ibudao
        10
    ibudao  
    OP
       Apr 15, 2014
    @exoticknight 针对我这个情况,那[1]取分组如何写?
    rubyking
        11
    rubyking  
       Apr 15, 2014   ❤️ 1
    Str.match(/\w+$/mg);
    ibudao
        12
    ibudao  
    OP
       Apr 15, 2014
    实际上我的源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
       Apr 15, 2014
    @rubyking 见上楼
    xu33
        14
    xu33  
       Apr 15, 2014 via iPhone
    使用regexp对象
    switch
        15
    switch  
       Apr 15, 2014
    可以先使用 match 提取出 Name: xxx 后再使用 replace 替换掉 Name: ,如:
    ```
    Str.match(/Name:\s*(\w+)/g) || []).map(function (str) {
    return str.replace(/Name:\s*/, "");
    }
    ```
    match 方法的正则里如果有 g(全局匹配)则分组引用无效了。
    shiye515
        16
    shiye515  
       Apr 16, 2014
    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  
       Apr 16, 2014
    @rubyking 这个匹配简洁明了
    shiye515
        18
    shiye515  
       Apr 16, 2014
    请原谅我回帖不看之前的回复 `Str.match(/(Name: *).*(?=($|\n))/g).map(function(v){return v.replace(/Name: */,'')}) `这个应该符合要求
    ibudao
        19
    ibudao  
    OP
       Apr 16, 2014
    @shiye515 谢谢分享。貌似js不支持后顾,这个需求就没法一个匹配搞定了
    s
        20
    s  
       Apr 16, 2014
    Str.match(/[^:]+$/mg);
    exoticknight
        21
    exoticknight  
       Apr 27, 2014
    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
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3096 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 66ms · UTC 00:33 · PVG 08:33 · LAX 17:33 · JFK 20:33
    ♥ Do have faith in what you're doing.