前言:
正则表达式:是处理字符串的一种表达方式。提供了一种从一组字符串中选择特定字符串的机制。
POSIX规范定义了UNIX操作系统应当支持的功能,POSIX规范的正则表达 式:
- BRE(Basic Regular Expression,基本型正则表达式)
- ERE(Extended Regular Express,扩展型正则表达式) ERE规则学习网站
一. Xcode执行脚本方式
1.1 第一种方式
打开Xcode,Cmd + Shift + N 新建工程如下
image.png image.png 新建的 Run Script 也可以修改名字如:脚本
1.2 第二种方式
打开Xcode,Cmd + Shift + N 新建工程如下 image.png image.png 然后打开 测试脚本-2 工程 image.png
// 脚本.sh 文件如下
# 所有参数
echo "$@" >> /dev/ttys000
echo "ewqweq" >> /dev/ttys000
配置完成之后编译成功,参数重定向到终端
wfx:~ issuser$ -mmm
ewqweq
1.3 第三种方式
xcconfig文件配置如下内容
CMD = echo "${SRCROOT}--${SYMROOT}"
TTY=/dev/ttys000
把脚本命令配置成xcode_run_cmd.sh文件
image.png
二. 正则表达式
正则表达式与通配符没有任何关系,不是包含关系!
- 通配符,是Shell提供的功能
- 正则表达式只是用来处理字符串
2.1 分析手机号正则表达式
// ^1 必须以1开头
// [3-9] 列表操作符只匹配 3~9的数字
// \d 表示0~9的数字
// {9}表示前面 \d 匹配9次
// $ 匹配字符串结尾
^1[3-9](\d){9}$
image.png
2.2 常用正则操作符image.png image.png image.png image.png image.png image.png image.png image.png image.png
2.3 查找命令grep
// 查找命令
grep: -v:逆转显示
-i:忽略大小写
-A:向上显示几行 -B:向下显示几行
-E:启用扩展
—color:显示颜色
egrep:grep -E
// 在测试代码.swift 文件中搜索 LG关键字
$ grep "LG" 测试代码.swift
struct LGTeacher {
struct LGTeachers {
extension LGTeacher {
static var all: [LGTeacher] {
[ LGTeacher(
LGTeacher(
LGTeacher(
LGTeacher(
LGTeacher(
// 向下显示3行
$ grep "LG" 测试代码.swift -A 3
// 不是大小写敏感,-i
$ grep "lgteacher" 测试代码.swift -i
// 除了LGTeacher 都显示出来
$ grep -v "LGTeacher" 测试代码.swift
// 搜索LGTeachers
$ grep "LGTeacher[s]" 测试代码.swift
// 搜索LGTeacher,不加s 当前表达式中^只在列表操作符[]中生效
$ grep "LGTeacher[^s]" 测试代码.swift
// 搜索除了以小写字母开头的oo之外 的所有oo字符 [:lower:]与a-z相同
$ grep "[^a-z]oo" 测试代码.swift
$ grep "[^[:lower:]]oo" 测试代码.swift
// 搜索除了以小写字母、大写字母开头的oo之外 的所有oo字符
$ grep "[^A-Za-z]oo" 测试代码.swift
// 搜索以0~9开头的oo字符 \d 、[0-9] -E(\d)相同
// \d加了()表示扩展型正则表达式,所以要加 -E 来启用扩展
$ grep "[0-9]oo" 测试代码.swift
$ grep "\doo" 测试代码.swift
$ grep -E "(\d)oo" 测试代码.swift
// 搜索除了以小写字母、大写字母、0~9开头的oo之外 的所有oo字符
// \W 与 [^A-Za-z0-9] 相同
$ grep "[^A-Za-z0-9]oo" 测试代码.swift
$ grep "\Woo" 测试代码.swift
// 搜索以C开头,以ci结尾,中间有两个字符 的字符串 .表示除了换行/nil的所有字符
$ grep "C..ci" 测试代码.swift
// *表示o字符匹配0次或者多次,即以C开头的字符
$ grep "Co*" 测试代码.swift
// 搜索以Co开头的字符
$ grep "Coo*" 测试代码.swift
// 搜索以Coo开头的字符 {2} 正则扩展,-E启用扩展
$ grep -E "Co{2}" 测试代码.swift
// 匹配模型文件 key 为 description 的那一行字段
// 下面加上$表示必须以" 为结尾
$ grep -E "description.*\"" 测试代码.swift
$ grep -E "description(.*)[\"]" 测试代码.swift
$ grep -E "description(.*)[\"]$" 测试代码.swift
// 反向引用操作符 (( \digit ) :
// 反向引用操作符由`\数字' 表示,数字需介于1-9,代表引用那个分组的匹配结果。
// 使用分组(.*)匹配出来的结果 后面添加 \1 表示引用第一个分组的匹配结果
$ grep -E "description(.*)[\"]\1" 测试代码.swift
2.4 贪婪匹配、勉强匹配与侵占匹配
贪婪模式、勉强模式与侵占模式:
假定要分析的字符串是xfooxxxxxxfoo
贪婪模式.*foo(贪婪模式)由两部分:
1.p1(.*)
2.p2(foo)组成。 其中p1中的匹配方式使用默认方式(贪婪型)。
第一轮:匹配开始时,p1匹配所有字符xfooxxxxxx,匹配成功,但p2无匹配字符,本轮匹配失 败;
第二轮:减少p1部分的匹配量,留出最后一个字符, 此时存在两个字符串,s1代表xfooxxxxxxfo和
s2代表o。 s1匹配p1, 但s2不匹配p2。本轮匹配失败;
第三轮,继续减少p1匹配量,留出两个字符, 字符串被分割成xfooxxxxxxf和oo两部分。结果同上。
第四轮,再次减少p1匹配量,字符串分割成xfooxxxxxx和foo两个部分,这次p1/p2同时匹配。 返回匹配成功。
勉强模式.*?foo(勉强模式)最小匹配方式:
1.p1(.*?)
2.p2(foo)组成。 其中p1中的匹配方式使用勉强模式匹配。
第一轮:p1由于是0或任意次,首先匹配0次。所以直接用字符串去匹配p2,但p2无匹配字符,本轮 匹配失败;
第二轮:增加p1部分的匹配量,匹配x, 此时存在两个字符串,s1代表x和s2代表fooxxxxxxfoo。 s1匹配p1, 但s2不匹配p2。本轮匹配失败;
继续上述匹配直到满足p2。
侵占模式.*+foo(侵占模式):
1.p1(.*+)
2.p2(foo)组成。 其中p1中的匹配方式使用侵占模式匹配。
匹配开始时读入所有字符串,和p1匹配成功,但没有剩余字符串去和p2匹配。匹配失败。
更高级用法——零宽断言: 断言:在指定位置应该满足一定的条件。
当捕获组以开头时?=,,表示该组将被用作零宽度正预测先行断言,仅当前一个模式与捕获组中的 模式相匹配时才与前一个模式匹配。例如,A(?=B)与A匹配,并且,⻢上跟着B。可以匹配AB、 ABB、ACB。
更高级用法——匹配特定类别的Unicode字符\p{ ... }: \p{L}所有字符,\p{Lu}所有小写字符,\p{N}。
\P{}匹配不特定类别的Unicode字符。
//探索以下命令
sed:可以将数据进行替换、删除、新增、选取特定内容等功能,用作一整行字符处理。
awk:比sed更精准,通常将一行在切割成相应的字段,再去处理。
小结:
简单地说,贪婪模式和占有模式相比,贪婪模式会在只有部分匹配成功的条件下,依次从多到少减 少匹配成功部分模式的匹配数量,将字符留给模式其他部分去匹配; 而占用模式则是占有所有能匹配成功部分,绝不留给其他部分使用。
2.5 Xcode是如何使用正则查找、替换
查找
打开测试代码.swift文件,Cmd + Find 搜索框输入(fooq|foo)*(qbarquux|bar)
点击右侧三角按钮,选择 Regular Expression 回撤匹配搜索结果
// 正则表达式 (one(x)|two(y))-and-(three\2|four\3)
$ echo "twoy-and-foury" | grep -E "(one(x)|two(y))-and-(three\2|four\3)"
twoy-and-foury
替换
例如测试文件中 license字段对应的值,以及后面逗号,全部替换成 空
license: "http://creativecommons.org/licenses/by-sa/3.0",
//正则表达式 可以有以下几种
(license)[:](\s*)["":./,_\-%A-Za-z0-9]*
(license)(.*)(\s*)(credit)(.*) //搜索了license credit两个字段以及对应值与逗号
(license)(.*)(\s*)
(license)(.*)
Xcode 打开 测试代码.swift 文件,Cmd + F 搜索,左侧Find 修改为Replace,右侧选择正则表达式 Regular Expression,输入正则表达式,点击all 即可全部替换
image.png 2.6 lldb如何使用正则对指定代码添加断点# 对指定库中的符合指定的正则表达式的函数符号下断点
(lldb) breakpoint set —func-regex=.—shlib=libfoo.dylib
# 对符合指定的正则表达式的符号下断点
(lldb) breakpoint set --func-regex regular-expression
# 通过对指定的正则表达式对文件内容设置断点
(lldb) breakpoint set --source-pattern-regexp regular-expression --fil
SourceFile
// 三种方式
(lldb) br set --func-regex=(.*)[bB]lock(.*)[Cc]opy(.*)
(lldb) br set -r (.*)[bB]lock(.*)[Cc]opy(.*)
(lldb) rb (.*)[bB]lock(.*)[Cc]opy(.*)
// 查看rb 命令
(lldb) help rb //查看rb 命令 就是 breakpoint set -r 缩写
// 在libsymtem_blocks.dylib动态库中查找
// -s 是 --shlib= 的缩写
(lldb) rb (.*)[bB]lock(.*)[Cc]opy(.*) --shlib=libsymtem_blocks.dylib
(lldb) rb (.*)[bB]lock(.*)[Cc]opy(.*) -s libsystem_blocks.dylib
// 在文件中查找
(lldb) breakpoint set --source-pattern-regexp=(.*)[bB]lock(.*)[Cc]opy(.*) --file runtime.cpp
(lldb) br set -p (.*)[bB]lock(.*)[Cc]opy(.*) -f runtime.cpp //缩写
// 删除3个断点
(lldb) br delete 3
// 查看断点列表中的7个断点
(lldb) br list 7
// 给breakpoint set -p 起别名为bp
// 起别名只在当前这一次运行中有效
(lldb) command alias bp breakpoint set -p %1 -f %2
(lldb) bp (.*)[bB]lock(.*)[Cc]opy(.*) runtime.cpp
网友评论