美文网首页
正则表达式

正则表达式

作者: 浅墨入画 | 来源:发表于2021-02-27 19:09 被阅读0次

    前言:

    正则表达式:是处理字符串的一种表达方式。提供了一种从一组字符串中选择特定字符串的机制。
    POSIX规范定义了UNIX操作系统应当支持的功能,POSIX规范的正则表达 式:

    • BRE(Basic Regular Expression,基本型正则表达式)
    • ERE(Extended Regular Express,扩展型正则表达式) ERE规则学习网站

    一. Xcode执行脚本方式

    1.1 第一种方式
    打开Xcode,Cmd + Shift + N 新建工程如下

    image.png image.png 然后打开 测试脚本-1 工程
    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 贪婪匹配、勉强匹配与侵占匹配

    image.png
    贪婪模式、勉强模式与侵占模式:
    假定要分析的字符串是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 回撤匹配搜索结果

    image.png 终端测试正则表达式
    // 正则表达式 (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
    

    相关文章

      网友评论

          本文标题:正则表达式

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