正则

73 阅读1分钟

概念

根据某种规则去匹配符合条件的字符串

元字符

(注意:一些元字符写在方括号中的时候有一些特殊的意思)

    • . 表示匹配任意单个字符 除换行符(/n)
    • [] 表示字符种类,匹配括号中的字符
  1. [^] 表示否定的字符种类,匹配除了这些字符
  2. * 表示匹配重复的0-n次*前的字符
  3. + 表示匹配重复的1-n次+前的字符
  4. ?表示?之前的字符是可选
  5. {n,m} 表示匹配<=n个<=m个{}之前的字符
  6. (xyz) 表示匹配括号中的xyz字符
  7. | '或' 匹配 | 前后的一个字符
  8. \ 转义字符 表示 . + * 等保留字符原来的意思
  9. ^ 从开始行开始匹配
  10. $ 从末端开始匹配
应用
  1. 点运算符 .
    ...o 表示o前面匹配任意三个字符
  2. 字符集 []
    你好 [Hh] 表示匹配 h,H中的任意一个 如:你好 H 或 你好 h
    注意 [.]匹配 .本身意义 如:你好[.] 表示 你好.
  3. 否定字符集 [^] 你好 [^M] 表示 除M以外的其他字符
  4. *
    [a-z]* 可以匹配任意长的小写字母 如:qweasdzxc
    *你好* 可以匹配任意长包含你好的字符 没有也可以
  5. +
    [a-z]+ 可以匹配任意长的小写字母 如:qweasdzxc
    +你好+ 可以匹配包含你好的字符 没有字符 你好两边必须有字符不然匹配不到

  6. 你好(吗)? 可以匹配 你好 或 你好吗
  7. {}
    你好\s{2,5} 表示匹配2-5次空格
    你好\s {2,} 表示匹配至少2次空格
    你好\s {2} 表示匹配2次空格
  8. (xyz)
    你好(asd) 表示匹配 asd字符
  9. |
    你好吗|呀 匹配你好吗 或 你好呀
  10. \
    \. 表示 . 句号
  11. ^
    ^你好 表示以 你好 开头
  12. $
    你好$ 表示以 你好 结尾
  13. \b 单词边界 表示匹配除[a-zA-Z0-9_]之外的字符
    \bis\b 可以匹配 @is@ 不能匹配 aisa
  14. \B 非单词边界 表示匹配[a-zA-Z0-9_]字符 匹配 aisa
简写字符集
  1. . 表示除换行符之外的字符
  2. \w 匹配所有字母数字 [a-zA-Z0-9_]
  3. \W 匹配所有非字符数字 [^\w]
  4. \d 匹配数字 [0-9]
  5. \D 匹配非数字 [^\d]
  6. \s 匹配所有空格 [\t\n\f\r\p{Z}]
  7. \S 匹配非空格 [^\s]
零宽度断言

pattern表示正则表达式

  1. 正向先行断言 ?=pattern 匹配某个模式之后的内容 不包含模式本身
    如:要匹配数字之后的字母 \d(?=[a-zA-Z]) "3a 4b 5c"可以匹配的3 4 5
  2. 负向先行断言 ?!pattern 匹配某个模式之后不是特定的内容
    如:\d(?![a-z]) "3a 4@ 5C" 可以匹配到4 5
  3. 正向后行断言 ?<=pattern 匹配某种模式之前的内容 不包含模式本身
    如:要匹配数字之前的字母 (?<=[a-z])\d "a3 b4 c5" 可以匹配到 3 4 5
  4. 负向后行断言 ?<!pattern 匹配到某种模式之前的不是特定的内容 如:要匹配数字之前的非字母 (?<![a-z])\d "a3 @4 C5" 可以匹配到4 5

零宽度断言不容易理解,可以这样理解。
零宽度是指匹配过程中不占用字符。
正向先行断言 x(?=y) 负向先行断言 x(?!y)
正向后行断言 (?<=y)x 负向后行断言 (?<!y)x
x,y分别代表正则表达式 。 先行断言 y必须在x右边 后行断言y必须在x左边

标志(修饰符)

/g 全局搜索
没有/g只能匹配一个 有的话所有的都匹配
/i 忽略大小写
不区分大小写
m 多行修饰符
你好$/gm 表示在每行的结尾都查询你好

贪婪匹配 .?

正则默认贪婪匹配
.* 表示匹配尽可能长的字符串

惰性匹配 .?*

表示只匹配第一个字符串