能玩会的正则表达式

191 阅读3分钟

正则表达式(关于正则表达式的一些基础介绍)

什么是正则表达式?

- 正则表达式是由一组字母和符号组成的特殊文本,它可以用来从文本中找出满足你需要的格式的句子
- 从左到右匹配主题字符串的模式。全称:Regular expression(regex/regexp)

知识章节

1. 基本匹配
  - 1.1 正则表达式执行搜索时的格式,由字母和数字组合而成。
  - 1.2 例如:"the" => *the* fat cat sat on the mgitat. 
2. 元字符
  - 2.1 点运算符 .
    - 匹配任意单个字符,但不匹配换行符。例如表达式.ai匹配任意字符后面是ai的字符串。
        ".ai" => "wo *lai* le, ni ai wo ma ?"
  const parttern = /.ai/;
  const str = "wo lai le, ni ai wo ma ?";
  const match = str.match(parttern);
  // ['lai', index: 3, input: 'wo lai le, ni ai wo ma ?', groups: undefined]
  - 2.2 字符集
    a. 字符集也叫做字符类。方括号用来指定一个字符集。在方括号中使用连字符来指定字符集的范围,不关心其顺序例如:
      "[Tt]he" => *The* car parked in *the* garage.
    b. 否定字符集。^一般是表示字符串的开头,但是用在[^]里表示否定。例如:
      "[^c]ar" => The car parked in the garage.
  - 2.3 重复次数
    a. 后面跟着元字符+,*,?的,用来指定匹配子模式的次数。这些元字符在不同的情况意思不同。
    b. *号,跟在*号面前的字符>=0次。例如:[a-z]* => M(y name is zhouxiahao).
    c. +号,匹配+号之前的字符出现>=1次。例如:c.+t 匹配以首字母c开头以t结尾,中间跟着至少一个字符的 字符串。
    d. ?号,匹配?号前的字符出现0次或1次。例如:[T]?he。
    e. {}号,量词,{2,3}表示最少2位最多3位,{2,}表示>=2位, {2}表示=2位。
    f. (...), 特征标群是一组写在 (...) 中的子模式。
    g. | 或运算符,用作判断条件。
    h. 反斜线 \ 在表达式中用于转码紧跟其后的字符。用于指定 { } [ ] / \ + * . $ ^ | ? 这些特殊字符。如果想要匹配这些特殊字符则要在其前面加上反斜线 \。例如:
      如果想要匹配句子中的 . 则要写成 \. 以下这个例子 \.?是选择性匹配.
      "(f|c|m)at\.?" => The fat cat sat on the *m*at.
    h. 锚点,指定开头和结尾:^指开头,$结尾。
3. 简写字符集
    简写	描述
      .	  除换行符外的所有字符
      \w	匹配所有字母数字,等同于 [a-zA-Z0-9_]
      \W	匹配所有非字母数字,即符号,等同于: [^\w]
      \d	匹配数字: [0-9]
      \D	匹配非数字: [^\d]
      \s	匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
      \S	匹配所有非空格字符: [^\s]
      \f	匹配一个换页符
      \n	匹配一个换行符
      \r	匹配一个回车符
      \t	匹配一个制表符
      \v	匹配一个垂直制表符
      \p	匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符
4. 零宽度断言(前后预查)
  - 4.1 ?=... 正先行断言
    定义一个正向先行断言需要使用(?=...)包裹住。返回结果只包含满足匹配条件的第一部分表达式。例如:
      "like(?=\slemon)" => I love the lemon, ary you *like* lemon?
  - 4.2 ?!... 负先行断言
    用于筛选所有匹配结果,筛选条件为后面不跟随着断言里定义的格式,与正先行断言相反。例如:
      "/(T|t)he(?!\sfat)/" => The fat cat sat on at *the* lat.
  - 4.3 ?<=... 正后发断言
    用于筛选所有匹配结果,筛选条件为其前跟随着的断言中定义的格式。例如:
      "(?<=(T|t)he\s>)(fat|mat)" = > The *fat* cat sat on at the *mat*.
      // ['fat', 'T', 'fat', index: 4, input: 'The fat cat sat on the mat.', groups: undefined]
  - 4.4 负后发断言
    用于筛选所有匹配结果,筛选条件为其前不跟随着断言中定义的格式。例如:
      "(?<!(T|t)he\s)(cat)" => The cat sat on *cat*.
5. 标志(模式修正符),修改表达式的搜索结果。这些表达式可以任意的组合使用。
  - i 忽略大小写
  - g 全局搜索
  - m 多行修饰符,例如:
    "/.at(.)?$/gm" => The fat
                      cat sat
                      on the mat.
6. 贪婪匹配与惰性匹配
  正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式。
    "/(.*at)/" => *The fat cat sat on the mat*.
  改为惰性匹配
    "/(.*?at)/" => *The fat* cat sat on the mat. 

参考链接

· https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md#1-%E5%9F%BA%E6%9C%AC%E5%8C%B9%E9%85%8D