search

Home  >  Q&A  >  body text

javascript - 如何用正则匹配最后一个下划线与其最近的小数点之间的所有字符?

http://i2.xxx.com/wx/images_2016/monkey/m4_1e3thtr.png
如上url,需要匹配_1e3thtr这个自动加上的随机版本号(位数可能不固定),正则应该怎么写,因为前面的文件夹路径可能包含下划线,所以需要匹配最后的一个下划线

大家讲道理大家讲道理2900 days ago617

reply all(5)I'll reply

  • 巴扎黑

    巴扎黑2017-04-10 17:04:01

    var s = 'http://i2.xxx.com/wx/images_2016/monkey/m4_1e3thtr.png';
    var r = /(_(?!.*_).+)\./;
    var m = s.match(r);
    console.log(m[1]); // _1e3thtr

    用一个正向环视来确保匹配到最后一个下划线。

    reply
    0
  • 巴扎黑

    巴扎黑2017-04-10 17:04:01

    .*(_.*?)\.
    第一步:“.*”,匹配到底;
    第二步:括号里,“_”,回溯至最后一个下划线,接着“.*?”忽略优先,退出括号;
    第三步:“\.”,如果没匹配到下划线后面的第一个点号,回溯到“.*?”,他匹配一个,退出括号,再看看后面是不是点号,如果不是,再回溯,然后匹配一个,看看后面是不是点号,......,最后匹配一个点号,结束。
    然后“$1”获取结果。

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 17:04:01

    (_\w+)\. 下划线到小数点之间只识别数字和字母,就能配对到你想要的部分

    reply
    0
  • 阿神

    阿神2017-04-10 17:04:01

    正则不会。。。
    
    var last_pos = url.lastIndexOf('_'),
        sub_str1 = url.substr(0,last_pos),
        sub_str2 = url.substring(last_pos+1),
        sub_len1 = sub_str1.length - sub_str1.lastIndexOf('.') - 1,
        sub_len2 = sub_str2.indexOf('.');
    

    if(sub_len1>=sub_len2) {

        url.substr(last_pos,sub_len2+1);
    }else {
        url.substr(last_pos-sub_len1,sub_len1+1);
    } 

    reply
    0
  • 黄舟

    黄舟2017-04-10 17:04:01

    我也有一个解法。

    var s = 'http://i2.xxx.com/wx/images_2016/monkey/m4_1e3thtr.png';
    var r = /(_[^_]*)\.[^.]+$/;
    var m = s.match(r);
    console.log(m[1]); // _1e3thtr

    主要思路是从结尾开始,结尾是.xxx形式,对应正则部分\.[^.]+$
    从结尾往前(左),应该是_1e3thtr形式的,对应的正则部分是(_[^_]*)
    这里不用担心与前面的URL的下划线匹配到,因为限制了结尾,而且(_[^_]*)这部分
    只能匹配到_xxxxxdafasf_开始,后续不是_的字符串。
    -END-

    reply
    0
  • Cancelreply