不同语言的字符串正则表达式

字符串的处理

涉及字符串形式的处理,未涉及字符串的意义
一般的字符串匹配
        某个特定的字符串--一个模式串
某种形式的字符串匹配--一组模式串
    通配符和正则表达式 *  ?
                通配符(wildcard),通配符可以用*来匹配任意字符
                使用场景:通配符多用在文件名上,比如查找find,ls,cp
    正则表达式<Regular Expression>
            字符串匹配模式:复杂的字符串搜寻、替换工作,
                    无法用简单的方式(类似借助标准库函数)达成
            正则表达式,*只匹配任意长度的前面的字符

1.正则表达式构成

1.正则表达式
        字符簇--匹配规则<元字符 分枝条件>--匹配结果
                    贪婪与懒惰
2.元字符 metacharacter
        位置:定位符
            ^ 和 $ 分别指字符串的开始与结束,\b 描述单词的前或后边界,\B 表示非单词边界。

        数量:限定符:
                要出现多少次才能满足匹配。有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
                *  + 和 ? 限定符都是贪婪的
                -----数量词的贪婪模式与非贪婪模式

        字符类和数字类 以及反义<包括以及排除>
        [ ]

        注意:不能将限定符与定位符一起使用
3.转义字符--反斜杠问题
        使用\来取消这些字符的特殊意义
        脱离元字符属性
4.括号
    圆括号()是组
    方括号是单个匹配  字符集/排除字符集/命名字符集,[]是定义匹配的字符范围

2.正则表达式类型

1.流派flavor:正则引擎
是否区分大小写
    比较NFA与DFA
词法分析器的任务就是将字符流转换成词法记号流
有穷自动机分为两类,即
        不确定的有穷自动机NFA
        确定的有穷自动机DFA
场景:文本处理
断言  捕获

2.具体
    01、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx  简称 BREs)
    02、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)
    03、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)
    DFA :awk  mysql
    传统型NFA Python sed vi
    POSIX NFA:
    DFA/NFA 混合 awk  grep egrep
3.解决问题逻辑
    必须出现
    可能出现
    不能出现
    常见操作:
        提取--替换--切分
        验证

3.各种语言的正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern
<1>实现哪些功能:查找,替换,分割
<2>具体实现方式: 各种语言的方式--如何创建正则表达式  
<3>多个模式如何构造在一起
    组合方式:或 的关系 使用 |  
        子表达式                        
    原生字符串 和特殊字符串

C语言
    C语言本身不具备RE特性,但是有很多库,在Linux下你可以很方便的使用regex.h提供的库

Java--Java中使用正则表达式方式 有两种
    01.String类自带的正则表达式工具-
                    -split()  以正则表达式对字符串进行分割 
    02.-regex
        import java.util.regex
            Pattern
            生成Matcher对象
Scala
        -split()  以正则表达式对字符串进行分割
        以字符为分割符进行分割--Java中的split添加了重载的方法
                    var s ="this. Iam.hello"
                    s.split("\\.")  以正则表达式对字符串进行分割,得到一个分割后的字符串数组
                    s.split("l")  以字符为分割符进行分割-遇到特殊元字符 记得转义

Shell
        切分字符串-- cut
        工具
            sed工具,sed本身也是一个管道命令,常用于一行
            awk工具
            grep
            扩展型正则 egrep

Python--采用面向对象式的方式
    Python语言中的正则表大会 标准包re提供
        01.提供了一个正则表达式引擎接口,它允许我们将正则表达式编译成模式对象,
                然后通过这些模式对象执行模式匹配搜索和字符串分割、子串替换等操
        02.字符串--raw string 原始字符串,在普通字符串文字前加r 或者R前缀
            单引号和双引号前的反斜杠
        假如你需要匹配文本中的字符”\”,
            方式01. 使用编程语言表示的正则表达式里将需要4个反斜杠”\\\\
            方式02.使用原生字符串
        匹配迭代器--区分大小写
          03. 正则表达式对象--re模块的compile()函数编译得到
                正则表达式匹配对象   -----调用正则表达式对象的regex.match()regex.fullmatch()regex.search()得到的结果就是

        方式一:使用步骤
            0. 引用到程序中
            01.生成字符串表达式对象
                re.complie(pattern,flag=0)
            02.检索--匹配--分割等
                re.search() re.match() re.split() re.sub()
            案例:
                import re
                key = r"<html><body><h1>hello world<h1></body></html>"#这段是你要匹配的文本
                p1 = r"(?<=<h1>).+?(?=<h1>)"#这是我们写的正则表达式规则,你现在可以不理解啥意思
                pattern1 = re.compile(p1)#我们在编译这段正则表达式

                matcher1 = re.search(pattern1,key)#在源文本中搜索符合正则表达式的部分
                print matcher1.group(0)#打印出来
        方式二:
                pattern1.search() pattern1.match() pattern1.split() pattern1.sub()

R语言
    使用字符串操作函数
        字符串匹配:grep()   gerpl()
                    grep()负责搜索给定字符串对象中特定表达式 ,并返回其位置索引。
                    grepl()函数与之类似,但其后面的"l"则意味着返回的将是逻辑值。
                regexprgregexprregexec
                    这三个函数返回的结果包含了匹配的具体位置和字符串长度信息,
                    可以用于字符串的提取操作
        字符串替代   sub()  gsub( )
                       gsub()负责搜索字符串的特定表达式,并用新的内容加以替代。
                         sub()函数是类似的,但只替代第一个发现结果。
        字符串分割:strsplit()
        字符串粘合:paste()负责将若干个字符串相连结,返回成单独的字符串
        字符串截取:substr()能对给定的字符串对象取出子
                substr返回的字串个数等于第一个参数的长度
                substring返回字串个数等于三个参数中最长向量长度,短向量循环使用
    01. 参数设置--设置为正则表达式  fixed=FALSE
    02. 点号脱离元字符属性, 同时反斜杠本身也是元字符属性
                    \\.
                    例如: grep("\\.", c("abc", "f.g"))
            strsplit(x, split, fixed= F, perl= F, useBytes= F)
    03. ##普通字符串
                    strsplit("f.g",".",fixed=T)
            ##正则表达式功能
                    strsplit("f.g","\\.",fixed=F)               
            split--分组因子,用于分组

SQL
    模糊匹配--正则表达式
    Oracle
        regexp_substr 函数使用正则表达式来指定返回串的起点和终点
        regexp_instr
        regexp_replace
        regexp_like
    MySQL
        <1>MySQLWHERE子句对正则表达式提供了初步的支持
            SELECT prod_name
            FROM products
            WHERE prod_name REGEXP '1000'
            ORDER BY prod_name;
    Hive
    01.split() split的第二个参数是一个regex,而‘?’有特殊的意义因此需要被转义。
    02. 正则表达式替换函数:regexp_replace
            语法: regexp_replace(string A, string B, string C)
            返回值: string
            说明:将字符串A中的 符合java正则表达式B 的部分替换为C
            注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。        
            举例:
            hive> select regexp_replace('foobar', 'oo|ar', '') from lxw_dual;
            fb

         正则表达式解析函数:regexp_extract
            语法: regexp_extract(string subject, string pattern, int index)
            返回值: string
            说明:将字符串subject依照pattern正则表达式的规则拆分。返回index指定的字符。
            举例:

附录

1.编译器设计原理--
    本地编译器--交叉编译器
    编译器进行语法分析--语义分析-目标文件-链接器
    分析程序生成器(Parser Generator)
    汇编编写第一个--然后迭代生成
2.Latex:生成复杂表格和数学公式和排版
    它的格式化引擎 TeX

参考:

精通正则表达式
正则指引

blogroll

social