评论

ios不支持正则的断言的解决辛酸路程

ios不支持?<=,?<!,应该是断言都不支持吧?exec是最终解决方案~

需求:将文字转为语音并播放,文字内容有电话格式1234-12234343和时间格式9:00-18:30,类似如下字符串:"我们上班时间:9:00-18:30,电话是1234-12234343"

实现方法:用微信的同声传译插件。

遇到问题:同声传译插件会将电话号码的1234读出一千两百三十四,听起来很奇怪有木有?=<=。

解决方法:所以我想着将电话号码之间加上空格,写个正则(/\d/g," $&"),数字是一个一个的读了。

又遇到问题:时间9:00-18:30被分割成了 9: 0 0- 1 8: 3 0,转成语音后就是九零零一八三零,也很奇怪有木有?=<=。

再次解决方法:将时间格式写个正则(/(\d+):(\d+)-(\d+):(\d+)/g,"$1点$2分到$3点$4分"),简直完美,时间格式完美读了出来^-^

又又遇到问题:处理时间的正则和电话的冲突了呀,那我电话的空格怎么加呢?

再再次解决方法:这个解决方法我研究了1天!终于写出来了,还用上了断言呢~ .replace(/(\d+):(\d+)-(\d+):(\d+)/g,"$1点$2分到$3点$4分").replace(/(?<!到)(?<!点)\d(?!点)(?!到)(?!分)/g, ' $&'),一共花了2天时间搞得正则,终于啊,成功了!迫不及待用手机扫开发版试试,听听那动人的语音结果。

又又又遇到问题:结果……手机打开一片空白,查了下微信社区,555,在ios上不支持,简直晴天霹雳,看下图官方的回复……

再再再次解决方法:再次查社区,看到下方正义之光的回答,十分感谢这位卢霄霄同志!!

我的终极解决方案:

   /**
   * @param {传入的原始字符串} str 
   */
  dealTextToVoice(str) {
    // 将时间格式更换为中文
    str = str.replace(/(\d+):(\d+)-(\d+):(\d+)/g, "$1点" + "$2分" + "到$3点" + "$4分")
    let patt = new RegExp("\\d{4}\.", "g")
    let result


    // 将3位以上的数字加空格,避免语音读出计数
    while ((result = patt.exec(str)) != null) {
      let newNum = result[0].replace(/\d/g, '$& ')
      str = str.replace(result[0], newNum)
    }
    return str
  }

至此,完美解决~

最后一次编辑于  2021-11-03  
点赞 2
收藏
评论

1 个评论

  • Sun
    Sun
    2021-11-03

    专门登录上来给你点赞,谢谢大佬

    2021-11-03
    赞同
    回复 1
    • 澄c澄悦
      澄c澄悦
      2021-11-03
      啊啊啊 受宠若惊,感谢点赞
      2021-11-03
      回复
登录 后发表内容