#101 解析字串


  • 0
    administrators

    完成一个 extractStr 函数,可以把一个字符串中所有的 :. 的子串解析出来并且存放到一个数组当中,例如:

    extractStr('My name is:Jerry. My age is:12.') // => ['Jerry', '12']
    

    注意,:. 之间不包含 :.。也即是说,如果 ::abc..,则返回 ['abc']

    (本题来源:《JavaScript Cookbook》)


  • 0

    @ScriptOJ 输入 :..UkUJZZfrcbDO:...QPkAMz::Lqweeu:.gAKMGk 应该输出 ["","","Lqweeu"],而你输出 ["","",""] 为啥应该输出 Lqweeu ?


  • 0
    administrators

    @Sunjourney 应该是个 bug,再试试


  • 7

    
    const extractStr = str => 
       (':.'+str)
       .match(/:([^:\.]*)(?=\.)/g)
       .splice(1)
       .map(x=>x.slice(1))
    
    

    正则断言只支持了一半是个坑,没有匹配输出null是另一个坑


  • 0

    const extractStr = (str) => {
      let result = [],
          pattern = /\:+(\w*)\.+/g,
          temp = null
      while(temp = pattern.exec(str)){
        result.push(temp[1])
      }
      return result
    }
    

  • 0

    为啥连map都不支持?


  • 0

    回复: #101 解析字串

    const extractStr = (str) => {
      return str.match(/(:\w+\.)/g).map((v) => {
           return v.match(/\w+/)[0]
      })
    }
    

    我在本机上测试通过,为啥在这里不通过,提示Cannot read property 'map' of null


  • 0
    administrators

    @llj @islishude 那是因为正则写错了,如果是 str 是 '' 呢?


  • 0

    const extractStr = (str) => {
    const ret = str.match(/:([^:.])*?./g) || []
    return ret.map((subStr) => subStr.replace(/[:.]/g, ''))
    }


  • 0

    @li#101 解析字串 中说:

    const extractStr = (str) => {
    const ret = str.match(/:([^:.])*?./g) || []
    return ret.map((subStr) => subStr.replace(/[:.]/g, ''))
    }

    同学,我感觉还是将通过测试的代码发出来比较好


  • 1

    用C++/Java的思路和写法写的,居然被AC了,从来没写过JS,大神给看一哈。

    const extractStr = (str) => /* TODO */
    {
        let result = [];
        let targets = str.split(".").slice(0, -1);
        targets.forEach(target=>{
            let position = target.lastIndexOf(":");
            if( position >= 0){
                result.push(target.substring(position + 1));
            }
        });
        return result;
    }
    

  • 1

    const extractStr = (str) => {
      const reg = /(?<=:).+?(?=\.)/g;
      return str.match(reg)
    }
    

    自测可以但是网页上提示compile error


  • 2

    const extractStr = (str) => /* TODO */
    {
    var strArr = str.split('.');
    var temp = [];
    if(strArr.length > 1){
    strArr[strArr.length-1] = '';
    for(var key in strArr){
    var num = strArr[key].lastIndexOf(':');
    if(num>=0){
    temp.push(strArr[key].substring(num+1))
    }
    }
    }
    return temp;
    }


  • 0

    const extractStr = (str) =>{
    var reg = /:[^:.]*./g
    var results = str.match(reg)
    if(!results){
    return []
    }
    else {
    for (let i = 0; i < results.length; i++) {
    results[i] = results[i].substr(1, results[i].length - 2)
    }
    }
    return results
    }


  • 0

    @linqiang 正则化也可以用,第一次写js,哈哈


  • 0

    str.match(/:([^:^.]*)./g).join('--').replace(/[:.]/g,'').split('--')


  • 0

    const extractStr = (str) => {
      let reg = /\:([^\.\:]*)\./g;
      let matchArr = str.match(reg) === null ? [] : str.match(reg) ;
      let result = matchArr.map((el) => {
        return el.slice(1, -1);
      });
      return result;
    }
    

  • 0

    尴尬,正则写了半天不对,最后花3分钟用C语言写法强写居然过了。
    const extractStr = (str) => {
    var result = [];
    var tmp = "";
    var state = 0;
    var i = 0;
    for (i = 0; i < str.length; i++) {
    var curChar = str[i];
    if (curChar == ':') {
    state = 1;
    tmp = "";
    }
    else if (curChar == '.') {
    if (state == 1) {
    result.push(tmp)
    state = 0;
    tmp = "";
    }
    } else {
    if (state == 1) {
    tmp += curChar;
    }
    }
    }

    return result;
    }


  • 0

    const extractStr = (str) => {
      const reg = /:([^\.:]*)\./g;
      const res = [];
      let regRes = null;
      while (regRes = reg.exec(str)) {
        res.push(regRes[1])
      }
      return res;
    }
    

  • 0

    @meltifa 我猜你那个反向断言太屌,那个判定规则识别不了,mdn上的正则文档里是没有反向断言的,虽然我比较欣赏你的写法,我就是不知道怎么反向取边界又不包括边界,但是我还是不敢用 这种反向断言


登录后回复
 

与 ScriptOJ 的连接断开,我们正在尝试重连,请耐心等待