2017-10-14 15:13:28

Regular Expression

Regular Expression

常简写为regex、regexp或RE),计算机科学的一个概念。 通常被用来检索、替换那些符合某个模式(规则)的文本

元字符

  • . 匹配除"\r\n"之外的任何单个字符;要匹配包括"\r\n"在内的任何字符,请使用像"[\s\S]"的模式.

  • x|y匹配x或y;"z|food"能匹配"z"或"food";"[zf]ood"则匹配"zood"或"food".

  • [xyz] 字符集合匹配所包含的任意一个字符;"[abc]"可以匹配"plain"中的"a".

  • [^xyz] 负值字符集合匹配未包含的任意字符;"[^abc]"可以匹配"plain"中的"plin".

  • [a-z] 字符范围匹配指定范围内的任意字符;"[a-z]"可以匹配"a"到"z"范围内的任意小写字母字符.

  • \perl Perl预定义字符族
  • \PERL 反向Perl预定义字符族

    Perl字符族

    1. \d == [0-9] 匹配一个数字字符
    2. \D == [^0-9] 匹配一个非数字字符
    3. \s == [\t\n\f\r\v] 匹配任何不可见字符(空格,制表符,换页符) (golang)
    4. \S == [^\t\n\f\r\v ] 匹配任何可见字符 (golang)
    5. \w ?== [0-9A-Za-z_] 匹配包括下划线的任何单词字符 (golang)
    6. \W ?== [^0-9A-Za-z_] 匹配任何非单词字符 (golang)

次数

  • *匹配前面的子表达式任意次;zo*能匹配"z",也能匹配"zo"以及"zoo"。*等价于o{0,}

  • +匹配前面的子表达式一次或多次(大于等于1次);"zo+"能匹配"zo"以及"zoo",但不能匹配"z"。+等价于{1,}

  • ?匹配前面的子表达式零次或一次;"do(es)?"可以匹配"do"或"does"中的"do"。?等价于{0,1}

  • {n}n是一个非负整数。匹配确定的n次;"o{2}"不能匹配"Bob"中的"o",但是能匹配"food"中的两个o

  • {n,}n是一个非负整数。至少匹配n次;"o{2,}"不能匹配"Bob"中的"o",但能匹配"foooood"中的所有o "o{1,}"等价于"o+"。"o{0,}"则等价于"o*"。

  • {n,m}m和n均为非负整数,其中n<=m最少匹配n次且最多匹配m次;"o{1,3}"将匹配"fooooood"中的前三个o为一组,后三个o为一组 "o{0,1}"等价于"o?"。在逗号和两个数之间不能有空格

模式

  • ?当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的.

边界

  • ^匹配输入字符串的开始位置;如果设置了RegExp对象的Multiline属性,^也匹配"\n"或"\r"之后的位置。

  • $匹配输入字符串的结束位置;如果设置了RegExp对象的Multiline属性,$也匹配"\n"或"\r"之前的位置。

  • \b匹配一个单词边界,也就是指单词和空格间的位置;"er\b"可以匹配"never"中的"er",但不能匹配"verb"中的"er"。

  • \B匹配非单词边界;"er\B"能匹配"verb"中的"er",但不能匹配"never"中的"er"。

  • ()将( 和 ) 之间的表达式定义为”组”(group),并且将匹配这个表达式的字符保存到一个临时区域;(一个正则表达式中最多可以保存9个),它们可以用符号(\,$)加数字0-9来引用[golang中室友二维数组获取,其中二维切片的第一个(下标0)标识所有匹配从第二个(下标1)表示组]

Golang中使用

  • func Compile(expr string) (*Regexp, error)

    Compile解析并返回一个正则表达式。如果成功返回,该Regexp就可用于匹配文本

  • func MustCompile(str string) *Regexp

    MustCompile类似Compile但会在解析失败时panic,主要用于全局正则表达式变量的安全初始化

  • Find(All)?(String)?(Submatch)?(Index)?

    'All'该方法会返回输入中所有互不重叠的匹配结果
    'String'出现了,匹配对象为字符串,否则应该是[]byte类型,返回值和匹配对象的类型是对应的
    'Submatch'出现了,返回值是表示正则表达式中成功的组匹配(子匹配/次级匹配)的切片

  • func (re *Regexp) Match(b []byte) bool

    Match检查b中是否存在匹配pattern的子序列

  • func (re *Regexp) MatchString(s string) bool

    MatchString类似Match,但匹配对象是字符串

  • func (re *Regexp) FindAllString(s string, n int) []string

    返回正则表达式re在s中的所有不重叠的匹配结果的[]string切片。
    如果没有匹配到,会返回nil
    N表示s [0,n) n<0表示整个s中查找

  • func(re*Regexp) FindAllStringSubmatch(s string, n int) [][]string

    返回正则表达式re在s中的所有不重叠的匹配结果及其对应的(可能有的)分组匹配的结果的[][]string切片

  • func (re *Regexp) Split(s string, n int) []string

    Split将re在s中匹配到的结果作为分隔符将s分割成多个字符串,并返回这些正则匹配结果之间的字符串的切片

  • func (re *Regexp) ReplaceAllString(src, repl string) string

    返回src的一个拷贝,将src中所有re的匹配结果都替换为repl。
    在替换时,repl中的'$'符号会按照Expand方法的规则进行解释
    和替换,例如$1会被替换为第一个分组匹配结果

本文链接:https://www.paishouba.com/post/regular-expression.html

-- EOF --

Comments