阅文时长 | 1.14分钟 字数统计 | 1834.4字符
主要内容 | 1、问题切入
2、什么是断言匹配
3、断言匹配的替换方案
4、声明与参考资料
『排坑·IPhone&IOS中不兼容正则中的断言匹配』
编写人 | SCscHero 编写时间 | 2020/12/7 AM12:14
文章类型 | 单篇 完成度 | 已完成
座右铭 每一个伟大的事业,都有一个微不足道的开始。

一、问题切入   完成度:100%

a) 问题发现

PC端谷歌、QQ、Edge浏览器正常运行,移动端安卓设备可以正常运行的正则。 Macbook没有测试 (没有Mac电脑) 。 在IPhone系设备,IOS系统中的Safari浏览器、QQ浏览器都出现报错。报错信息在JS中使用try..catch语句获取到:SyntaxError:Invalid regular expression:invalid group specifier name。

b) 问题分析&排查方向

报错分析:

报错翻译过来是"正则表达式无效:组说明符名称无效。",推测是正则中的分组问题,然后经查其他使用正则的接口都是正常的,但出错接口是因为含有断言匹配。于是乎方向似乎明确了,IPhone设备可能将断言匹配当做了普通分组,于是为了兼容IPhone设备,改用分组写法匹配数据,详见例子。

解决过程/排查方向/摸索过程(可跳过看下面解决方案):

【错误方向1】首先,由于在其他设备、系统中都可以正常运行。于是以为是CSS前缀问题,于是检查了postcss-loader、autoprefixer插件。正常无问题。

【错误方向2】然后,检查了下ES6语法是否转换了ES5,检查了babel配置,仍然没问题。

【错误方向3】接着,想直接在IPhone机调试,发现无法调试。于是寻找可调试方案。

  • 需要使用Macbook电脑,由于没有硬件设备,于是寻找可替代方案。
  • 使用windows系统模拟Safari网页。此种方法需要安装一大堆环境,由于担心安装过程中又出现一大堆坑,于是继续寻找可替代方案。
  • 于是使用异常捕获,在出错接口中弹出。捕获了异常。

c) 解决方案

改写断言匹配的正则表达式内容,以其他正则表达式内容替代。详见例子。

二、什么是断言匹配   完成度:100%

a) 个人理解

断言匹配是什么?断言匹配是正则表达式中的一个概念。博主在Google了一下,没有官方的定义,但在中文中基本叫断言匹配。断言匹配大致分为四种。详见下文。

断言匹配作用/用途?是正则表达式的条件语句。断言匹配的原子组,不会被正常的分组。所以在匹配的时候,可以只匹配需要的部分。

b) 名词普及

  • (?!)零宽负向先行断言
  • (?=)零宽先行断言
  • (?<=)零宽后行断言
  • (?<!)零宽负向后行断言。

c) 通俗解释

  • ?!后面不是什么
  • ?=后面是什么
  • ?<=前面是什么。
  • ?<!前面不是什么

d) 详细示例

下面本人使用JS的正则表达式的三个小例子来做示例。


  {
//案例:替换除了pre标签的其他标签为p标签。
let str = `
<h1>h1 label content</h1>
<pre>pre label content</pre>
<span>span label content</span>
`;
let reg = /<(?!pre)(.*?)>(?<content>[\s\S]+?)<\/\1>/g;
let repReg = str.replace(reg, "$<content>");
console.log(repReg);
} {
//案例:将所有元前面数字统一加上.00;
let str = `
500,1000.00,1500
`;
let reg = /(\d+)(.00)?/g;
console.log(reg.exec(str));
//v,匹配值。args,详细数组。
let res = str.replace(reg, (v, ...args) => {
console.log(args);
args[1] = args[1] || ".00";
return args.splice(0, 2).join("");
});
console.log(res);
} {
//案例:匹配字母后面的数据
let str = "SCscHero123";
let reg = /(?<=SCscHero)\d+/i;
console.log(str.match(reg));
} {//案例:匹配字符串中不能出现SC字母
let str = "SSSCscHero";
//即起始的后面,不能出现SC
console.log(str.match(/^(?!.*SC.*).*$/));
}

三、断言匹配的替换方案   完成度:100%

断言匹配的替换方案还是挺多的,主要目的就是分析字符串,达到你的目的即可(基本是废话,手动滑稽)。下面用本人的一个例子讲一下怎么处理。


【要求】从下面的字符串中提取需要的数字。

【分析】只需要提取数字,前后有固定的规律,因此符合使用断言匹配的条件。同样,也可以使用分组匹配提取其中的内容。

    {//使用断言匹配写法
let str = "SCscHero123SCscHero";
let reg = /(?<=SCscHero)\d+(?=SCscHero)/g;
console.log(str.match(reg)[0]);
{//使用分组替换写法
let str = "SCscHero123SCscHero";
let reg = /SCscHero(\d+)SCscHero/;
console.log(str.match(reg)[1]);
}

这只是个小例子哈,如果有其他问题解决不了的,请留言博客。让博主也想想办法,目前只能想到这个应用。

四、声明与参考资料   完成度:100%

原创博文,未经许可请勿转载。

如有帮助,欢迎点赞、收藏、关注。如有问题,请评论留言!如需与博主联系的,直接博客私信SCscHero即可。

排坑&#183;IPhone&IOS中不兼容正则中的断言匹配的更多相关文章

  1. 排坑&#183;ASCII码为160的空格(nbsp)

    阅文时长 | 2.83分钟 字数统计 | 1345.2字符 『排坑·ASCII码为160的空格(nbsp)』 编写人 | SCscHero 编写时间 | Wednesday, September 9, ...

  2. JS IOS/iPhone的Safari不兼容Javascript中的Date()问题

    var date = new Date('2016-11-11 11:11:11'); document.write(date); 最近在写一个时间判断脚本,需要将固定好的字符串时间转换为时间戳进行比 ...

  3. 【js】【ios】【safari】【兼容问题】【转发】JS IOS/iPhone的Safari不兼容Javascript中的Date()问题

    引用地址:http://www.cnblogs.com/yiven/p/6053872.html   1 var date = new Date('2016-11-11 11:11:11'); 2 d ...

  4. 记一次事件委托在 ios 下的兼容 bug

    项目中碰到的兼容类 bug,记录一二. 页面上有几个同类型的控件,点击它们会触发一些事件,很显然,事件委托优于批量绑定.为了图方便,我将 click 事件绑定到了 document.body 上(绑定 ...

  5. iOS 的 APP 在系统中如何适配不同的屏幕的尺寸

    iOS 的 APP 在系统中如何适配不同的屏幕的尺寸 标签: 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone ...

  6. iOS逆向工程之Hopper中的ARM指令

    虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...

  7. Spring-Cloud之Eureka排坑之旅

    1 快速demo 1.0 环境说明   Intelli IDEA+Spring Boot 1.1 新建工程chap52(通过New Project->Spring Initializer-> ...

  8. 移动端开发ios和安卓兼容问题

    移动端开发ios和安卓兼容问题 最近做移动端混合开的时候遇到一些安卓和iOS的兼容性问题,兼容想问题不仅在浏览器存在也在APP开发当中也会经常遇到这样的情况. 最近看了一下内容很不错的移动端开发相关的 ...

  9. 初次见面C#排坑记录

    排一次开发C#遇到的坑,同时说一下自己对C#中文件夹构建方式的体会. 一个开发Java的人留下了痛苦的泪水,变量命名规则不一样,连括号打的都不一样,

随机推荐

  1. ES 终于可以搜到”悟空哥“了!

    Elasticsearch 搜索引擎内置了很多种分词器,但是对中文分词不友好,所以我们需要借助第三方中文分词工具包. 悟空哥专门研究了下 ik 中文分词工具包该怎么玩,希望对大家有所帮助. 本文主要内 ...

  2. 计算机体系结构——CH2 指令系统

    CH2 指令系统 右键点击查看图像,查看清晰图像 X-mind CH2 指令系统 数据表示 定义 指计算机硬件能够直接识别,可以被指令系统直接调用的那些数据类型 确定哪些数据类型用哪些数据表示实现,是 ...

  3. dll远线程注入

    原理 核心函数 CreateRemoteThread:让在其他进程中创建一个线程变成可能 核心思想 HANDLE WINAPI CreateRemoteThread( __in HANDLE hPro ...

  4. 经过努力+作弊,我终于完成了leetcode通过率最低的一道题

    前两天刷leetcode的时候,突发奇想,leetcode中最难的一道题是什么样子的呢? 于是,我就将所有题目(https://leetcode-cn.com/problemset/all/ )按照通 ...

  5. C# .NET Socket 简单实用框架,socket组件封装

    参考资料 https://www.cnblogs.com/coldairarrow/p/7501645.html 根据.NET Socket 简单实用框架进行了改造,这个代码对socket通信封装还是 ...

  6. Elasticsearch 集群优化-尽可能全面详细

    Elasticsearch 集群优化-转载参考1 基本配置 基本配置,5台配置为 24C 125G 17T 的主机,每台主机上搭建了一个elasticsearch节点. 采用的elasticsearc ...

  7. [树形DP]战略游戏

    战 略 游 戏 战略游戏 战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题.他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上 ...

  8. html+css写出响应式侧边导航栏

    html部分:先写用div画好六个导航的卡片,再利用css添加响应效果 <div class='card-holder'> <div class='card-wrapper'> ...

  9. python3美化表格数据输出结果

    技术背景 在前面一篇博客中我们介绍过关于python的表格数据处理方案,这其中的工作重点就是对表格类型的数据进行梳理.计算和展示,本文重点介绍展示这个方面的工作.首先我们看一个案例,定义一个数组形式的 ...

  10. Spring(六)SpringMVC的数据响应

    SpringMVC的请求和响应 SpringMVC的数据响应 01-SpringMVC的数据响应-数据响应方式(理解) 1)    页面跳转 直接返回字符串 通过ModelAndView对象返回 2) ...