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

310 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情

需求: 将文字转为语音并播放,文字内容有电话格式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,"11点2分到33点4分"),简直完美,时间格式完美读了出来^-^

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

再再次解决方法: 这个解决方法我研究了1天!终于写出来了,还用上了断言呢~ .replace(/(\d+):(\d+)-(\d+):(\d+)/g,"11点2分到33点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
  }

至此,完美解决~