美文网首页
Regular Expressions (9)

Regular Expressions (9)

作者: 为了自由的白菜 | 来源:发表于2021-06-15 09:16 被阅读0次

    基于POSIX BRE & ERE
    ERE规则学习网站

    脚本补充知识

    1. 明确Shell的解析到底是怎样的
      1. 从上到下, 从左到右, 胶水语言
      2. 例如 "" -> 代表字符串 -> for循环通过空格分割
        1. for 循环里面用\来屏蔽"" -> 怕shell提前展开通配符
    2. 明白循环里到底是什么以空格为分割

    Xcode执行脚本的三种方式

    1. com shift n -> other -> empty -> 脚本-1

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

      1. 通过这种创建的有info选项来配置外部脚本的基本信息
      2. Action -> Product 里面的操作
      3. 例如: 脚本2配置
      4. ![脚本执行方法2]](https://img.haomeiwen.com/i1367029/e84535b2f1f5f228.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
    3. 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. 正则表达式只是用来处理字符串

    例子

    匹配手机号

    操作符讲解

    直抒胸臆操作符
    image.png
    渣男操作符
    image.png
    重复操作符
    image.png
    间隔操作符( { ... } ):
    image.png
    备胎操作符
    image.png
    列表操作符
    image.png
    字符类别操作符( [: ... :] ):
    image.png
    特殊字符类别操作符:
    image.png
    范围操作符
    image.png

    egrep与正则

    正则表达式基础

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

    正则分组与向后引用

    1. $grep -E "description(.*)[\"]\1" 变量的定义.swift
      1. \1 -> 代表前面使用的第一个分组(.*)
      2. image.png
    2. 操作符优先级
      1. image.png

    扩展

    以下讲解的内容在部分语言中不支持!
    每种环境,无论是Python,Perl,Java,C#,Ruby还是其他,在实现正则表 达式时都有特殊的差别。Swift也不例外!

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

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

    贪婪匹配

    只需记住贪婪匹配即可


    image.png image.png
    贪婪匹配例子
    image.png
    勉强匹配例子
    image.png
    侵占模式
    image.png
    例子总结
    image.png
    grep
    image.png
    image.png

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

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

    Xcode正则查找

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

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

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

    下断点探索源码

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

    相关文章

      网友评论

          本文标题:Regular Expressions (9)

          本文链接:https://www.haomeiwen.com/subject/ioxgeltx.html