Regular Expressions (9)

简介: 基于POSIX BRE & ERE

基于POSIX BRE & ERE


ERE规则学习网站


脚本补充知识


  1. 明确Shell的解析到底是怎样的


  1. 从上到下, 从左到右, 胶水语言
  2. 例如 "" -> 代表字符串 -> for循环通过空格分割


  1. for 循环里面用\来屏蔽"" -> 怕shell提前展开通配符


  1. 明白循环里到底是什么以空格为分割


Xcode执行脚本的三种方式


  1. com shift n -> other -> empty -> 脚本-1
Targets -> + -> other -> Aggregate -> 执行脚本
Build Phases -> + -> New Run Sript Phase(新建出来后,双击可以修改名字的)
  1. com shift n -> External Bulid System -> 脚本-2 (外部引用)


  1. 通过这种创建的有info选项来配置外部脚本的基本信息
  2. Action -> Product 里面的操作
  3. 例如:


微信图片_20220510015504.png
脚本2配置


     d.![脚本执行方法2]](https://upload-images.jianshu.io/upload_images/1367029-e84535b2f1f5f228.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


  1. MachOAndSymbol 工程 -> ...RunCMD.xcconfig -> 来执行脚本


扩展(ERE)正则表达式学习


正则定义


正则表达式:是处理字符串的一种表达方式。提供了一种从一组字符串中 选择特定字符串的机制。


POSIX规范定义了UNIX操作系统应当支持的功能,POSIX规范的正则表达式:


  1. BRE(Basic Regular Expression,基本型正则表达式)
  2. ERE(Extended Regular Express,扩展型正则表达式)


BRE和ERE二者的区别


简单的说就在于(、)、{、}、+、?、|这7个特殊字符的使用方法上:


  1. 在BRE中如果想要这些字符表示特殊的含义,就需要把它们转义。元字符 (、)、{、}、 +、?、| 必须转义之后才具有特殊含义,如+、?、|,而且也支持\1、\2之类反向引用。
  2. 反之,在ERE中如果要这些字符不表示特殊的含义,就需要把它们转义。虽然BRE名为“基 本”而ERE名为“扩展”,但ERE并不要求兼容BRE的语法,而是自成一体。
  3. BRE中的特殊字符:.、\、[、^、$、*。
  4. ERE中的特殊字符多了7个,即:.、\、[、^、$、*、(、)、{、}、+、?、|。


正则与通配符


正则表达式与通配符没有任何关系,不是包含关系!


  1. 通配符,是Shell提供的功能
  2. 正则表达式只是用来处理字符串


例子


微信图片_20220510015509.png

匹配手机号


操作符讲解


直抒胸臆操作符


微信图片_20220510015513.png

image.png


渣男操作符


微信图片_20220510015517.png

image.png


重复操作符


微信图片_20220510015522.png

image.png


间隔操作符( { ... } ):


微信图片_20220510015526.png

image.png


备胎操作符


微信图片_20220510015530.png

image.png


列表操作符


微信图片_20220510015535.png

image.png


字符类别操作符( [: ... :] ):


微信图片_20220510015539.png

image.png


特殊字符类别操作符:

微信图片_20220510015543.png

image.png


范围操作符


微信图片_20220510015548.png

image.png


egrep与正则


正则表达式基础


1. 终端进入文件夹模块
2. $grep "LG" 变量的定义.swift
   a. $grep "LG" 变量的定义.swift -A 1 -> 搜索到后,并多向下显示一行
   b. -B 1 -> 向上多显示1行
3. $grep "lgteacher" 变量的定义.swift -i -> grep默认大小写敏感,-i告诉grep,大小写都需要搜索
4. $grep "LGTeacher" 变量的定义.swift -v -> -v反转, 除了要搜索的,其余的都显示出来
5. $grep "LGTeacher[^s]" 变量的定义.swift -> LGTeacher
   a. $grep "LGTeacher[s]" 变量的定义.swift -> LGTeachers
6. $grep "oo" 变量的定义.swift -> 搜索oo
   a. $grep "[^a-z]oo" 变量的定义.swift -> 不准以小写字母开头
   b. $grep "[^[:lower:]]oo" 变量的定义.swift -> 查表, 搜索结果跟上面的一样
   c. $grep "[^A-Za-z]oo" 变量的定义.swift -> 以数字或以字符开头
   d. $grep "[0-9]oo" 变量的定义.swift -> 9oo
   e. $grep "[^A-Za-z0-9]oo" 变量的定义.swift -> *oo
   f. $grep "\woo" 变量的定义.swift -> 除了*oo
   ⅰ. $grep "\Woo" 变量的定义.swift -> *oo
   g. $grep -E "(\d)oo" 变量的定义.swift -> -E, 后面因为加了()变成了扩展正则表达, -E代表启动扩展正则
7. $grep "C..c" 变量的定义.swift -> .代表任意字符
   a. $grep "C.." 变量的定义.swift -> 注意.不能匹配换行和null
   b. $grep "Co*" 变 量的定义.swift -> *匹配前一个元素0此或多此
   c. $grep "Coo*" 变量的定义.swift
   d. $grep "Co{2}"  变量的定义.swift -> 匹配前一个元素2次
   ⅰ. $grep -E "Co{2}" 变量的定义.swift -> 这里要启用扩展正则
8. $grep "^description.*\"$" 变量的定义.swift -> 这里注意^是匹配字符串开头,这样写不行
   a. $grep "description.*\"$" 变量的定义.swift
   b. $grep "description.*\"$" 变量的定义.swift

正则分组与向后引用


  1. $grep -E "description(.*)[\"]\1" 变量的定义.swift
  1. \1 -> 代表前面使用的第一个分组(.*)


微信图片_20220510015552.png

image.png


  1. 操作符优先级


微信图片_20220510015556.png

image.png


扩展


以下讲解的内容在部分语言中不支持!


每种环境,无论是Python,Perl,Java,C#,Ruby还是其他,在实现正则表 达式时都有特殊的差别。Swift也不例外!


Objective-C和Swift都要求您转义文字字符串中的特殊字符(即,在它们 前面加反斜杠\字符)。反斜杠本身就是这样的特殊字符之一!由于用于创建 正则表达式的模式也是字符串,因此会增加复杂性,因为在使用Stringand时 需要转义反斜杠字符NSRegularExpression。


这意味着标准正则表达式.将出现\.在您的Swift(或Objective-C)代码中。


  1. 文字”\.”定义了一个类似于以下字符串:.
  2. 正则表达式.然后将匹配单个句点字符。


贪婪匹配


只需记住贪婪匹配即可


微信图片_20220510015600.png

image.png


微信图片_20220510015604.png

image.png


贪婪匹配例子


微信图片_20220510015608.png

image.png


勉强匹配例子


微信图片_20220510015612.png

image.png


侵占模式


微信图片_20220510015617.png

image.png


例子总结


微信图片_20220510015621.png

image.png


grep


微信图片_20220510015625.png

image.png



微信图片_20220510015629.png

image.png


grep + sed + awk 在日常开发中经常用到的


Xcode是如何使用正则查找/替换


Xcode正则查找


1. com + f
2. 选择Regular Expression(正则)
3. egrep '(fooq|foo)*(qbarquux|bar)'
   a. fooqbar -> 最终结果, 以为贪婪匹配失败后,是从后往前匹配的,找到bar之后,就不会再找qbarquux
   b. 其实在终端试了, 可以匹配 -> echo "fooqbarquux" | egrep '(fooq|foo)*(qbarquux|bar)'
   c. 但是Xcode直接查找却不行
   d. 最后选以上都对
4. egrep ‘((a*)b)*\1\2'
   a. (a*) -> 第二个分组
   b. ((a*)b) -> 第一个分组
   c. aabababa
   d. aabaabaabaabaa, 发现两种都可以
   e. 如果分组不止一次匹配(例如,如果后面跟着重复运算符),则 后向引用将匹配分组最后匹配的子字符串。
5. egrep ‘(one(x)|two(y))-and-(three\2|four\3)’
   a. onex-and-threex
   b. twoy-and-foury
   c. 分组3只有在two(y)匹配到时才有, 即如果匹配的是one(x)则没有分组3
6. 正则批量删除
   a. (license)[:](\s*)["a-z:.,\/-0-9]* -> \s空格
   b. (license)(.*)(\s*)
   c. (license)(.*)

lldb如何使用正则对指定代码添加断点


  1. 对指定库中的符合指定的正则表达式的函数下断点 -> 对符号


 (lldb) breakpoint set —func-regex=.—shlib=libfoo.dylib
  1. 对符合指定的正则表达式的符号下断点 -> 对符号
(lldb) breakpoint set --func-regex regular-expression
  1. 通过对指定的正则表达式对文件内容设置断点 -> 对内容
a. (lldb) breakpoint set --source-pattern-regexp regular-expression --file SourceFile


下断点探索源码


1. block copy
2. 通过正则来找
   a. (.)[B|b]lock(.)[C|c]opy(.)*
   b. 去全局搜索的地方, 选择正则搜索Regular Expression
   c. 运行代码, 并在main函数里面下断点 -> breakpoint set —func-regex=(.*)[B|b]lock(.*)[C|c]opy(.*)
      ⅰ. —func-regex= 或者 —func-regex空格
      ⅱ. —func-regex的缩写为-r -> -r空格 -> 使用-r时必须用空格来区别参数
      ⅲ. br set -r (.*)[B|b]lock(.*)[C|c]opy(.*) -> 与上面效果一样
      ⅳ. rb (.*)[B|b]lock(.*)[C|c]opy(.*) -> 与上面效果一样 -> help rb
   d. rb (.*)[B|b]lock(.*)[C|c]opy(.*) —shlib=libsystem_blocks.dylib -> 在某个动态库里查找并下断点
     ⅰ. rb (.*)[bB]lock(.*)[Cc]opy(.*) -s libsystem_blocks.dylib
   e. breakpoint set --source-pattern-regexp=(.*)[bB]lock(.*)[Cc]opy(.*) --file runtime.cpp
      ⅰ. br delete 2 -> 删除
      ⅱ. --source-pattern-regexp -> 对文件的内容设置断点
      ⅲ. br list 7 -> 显示第7组断点
      ⅳ. 缩写br set -p (.*)[bB]lock(.*)[Cc]opy(.*) -f runtime.cpp
   f. command alias pb breakpoint set -p %1 -f %2 -> 给br set -p这个命令起别名 -> 注意要写全称,不能缩写
      ⅰ. help pb
      ⅱ. pb (.*)[bB]lock(.*)[Cc]opy(.*) runtime.cpp
      ⅲ. 这种别名, 只在当前这次运行时生效




目录
相关文章
|
PHP 数据库 数据安全/隐私保护
|
9月前
|
人工智能 运维 Kubernetes
这家公司使用 MCP,已向企业交付 1000 名数字员工
君润人力是一家科技驱动的人力资源服务公司,专注于为服务业提供一站式人力资源解决方案。通过AI与数字员工技术,公司在招聘、社保等领域实现自动化服务,提升效率并降低成本。同时,君润积极探索MCP协议和Higress网关技术,构建“数字灵工”平台,推动人服行业的智能化转型。
|
9月前
|
人工智能 IDE 定位技术
通义灵码 AI IDE 上线,第一时间测评体验
通义灵码 AI IDE 重磅上线,开启智能编程新纪元!无需插件,开箱即用,依托通义千问大模型,实现高效、智能的编程体验。支持 MCP 工具链,可快速调用多种服务(如12306余票查询、高德地图标注等),大幅提升开发效率。结合 Qwen3 强大的 Agent 能力,开发者可通过自然语言快速构建功能,如智能选票系统、地图可视化页面等。行间代码预测、AI 规则定制、记忆能力等功能,让 AI 更懂你的编码习惯。Lingma IDE 不仅是工具,更是开发者身边的智能助手,助力 AI 编程落地实践。立即下载体验,感受未来编程的魅力!
949 16
|
12月前
|
Swift iOS开发 开发者
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
2151 13
苹果app上架-ios上架苹果商店app store 之苹果支付In - App Purchase内购配置-优雅草卓伊凡
|
9月前
|
Ubuntu 安全 Linux
详述Ubuntu中的/etc/rc.local与/etc/init.d/rc.local文件的不同应用场景
总结一下,`/etc/rc.local`和 `/etc/init.d/rc.local`可以说是系统自定义服务的二人转。在Systemd登基以前,`/etc/rc.local`是大明星,负责在系统启动的最后一刻执行任务。而 `/etc/init.d/rc.local`则扮演着保证 `rc.local`文件内容可以被执行的幕后角色。随着Ubuntu版图的更迭和Systemd的崛起,两者都有所转变,但它们依旧是实现系统自启动自定义命令和程序的得力工具,虽然现在要通过一些额外的设置来唤醒它们的能力。此外,由于Systemd的灵活性和强大,推荐使用更加现代化的Systemd单元(unit)文件来替代这
368 10
|
机器学习/深度学习 缓存 自然语言处理
DeepSeek背后的技术基石:DeepSeekMoE基于专家混合系统的大规模语言模型架构
DeepSeekMoE是一种创新的大规模语言模型架构,融合了专家混合系统(MoE)、多头潜在注意力机制(MLA)和RMSNorm归一化。通过专家共享、动态路由和潜在变量缓存技术,DeepSeekMoE在保持性能的同时,将计算开销降低了40%,显著提升了训练和推理效率。该模型在语言建模、机器翻译和长文本处理等任务中表现出色,具备广泛的应用前景,特别是在计算资源受限的场景下。
1480 29
DeepSeek背后的技术基石:DeepSeekMoE基于专家混合系统的大规模语言模型架构
|
设计模式 缓存 IDE
Java进阶之路-如何写出高质量的代码——《我的Java打怪日记》
本文提出可读性是高质量代码最重要的特点,然后分析了好代码和坏代码的特点,然后从战略层面给出写出高质量代码的几条建议,最后给出几个Java领域比较出名的开源框架,并给出一些代码实践。
2981 0
|
存储 开发工具 git
解决“hint: the same ref. If you want to integrate the remote changes, usehint: ‘git pull‘ before pus”
解决“hint: the same ref. If you want to integrate the remote changes, usehint: ‘git pull‘ before pus”
486 3
|
缓存 JavaScript 前端开发
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
这篇文章介绍了如何解决npm版本与Node.js版本不兼容的问题,提供了查看当前npm和Node.js版本的步骤,以及如何根据Node.js版本选择合适的npm版本并进行升级的详细指导。
成功解决:npm 版本不支持node.js。【 npm v9.1.2 does not support Node.js v16.6.0.】
|
存储 安全 数据安全/隐私保护
可信启动、安全启动:SGX、TrustZone、SecureEnclave
可信启动、安全启动:SGX、TrustZone、SecureEnclave
1343 0