概念
根据某种规则去匹配符合条件的字符串
元字符
(注意:一些元字符写在方括号中的时候有一些特殊的意思)
-
- . 表示匹配任意单个字符 除换行符(/n)
-
- [] 表示字符种类,匹配括号中的字符
- [^] 表示否定的字符种类,匹配除了这些字符
- * 表示匹配重复的0-n次*前的字符
- + 表示匹配重复的1-n次+前的字符
- ?表示?之前的字符是可选
- {n,m} 表示匹配<=n个<=m个{}之前的字符
- (xyz) 表示匹配括号中的xyz字符
- | '或' 匹配 | 前后的一个字符
- \ 转义字符 表示 . + * 等保留字符原来的意思
- ^ 从开始行开始匹配
- $ 从末端开始匹配
应用
- 点运算符 .
...o 表示o前面匹配任意三个字符 - 字符集 []
你好 [Hh] 表示匹配 h,H中的任意一个 如:你好 H 或 你好 h
注意 [.]匹配 .本身意义 如:你好[.] 表示 你好. - 否定字符集 [^] 你好 [^M] 表示 除M以外的其他字符
- *
[a-z]* 可以匹配任意长的小写字母 如:qweasdzxc
*你好* 可以匹配任意长包含你好的字符 没有也可以 - +
[a-z]+ 可以匹配任意长的小写字母 如:qweasdzxc
+你好+ 可以匹配包含你好的字符 没有字符 你好两边必须有字符不然匹配不到 - ?
你好(吗)? 可以匹配 你好 或 你好吗 - {}
你好\s{2,5} 表示匹配2-5次空格
你好\s {2,} 表示匹配至少2次空格
你好\s {2} 表示匹配2次空格 - (xyz)
你好(asd) 表示匹配 asd字符 - |
你好吗|呀 匹配你好吗 或 你好呀 - \
\. 表示 . 句号 - ^
^你好 表示以 你好 开头 - $
你好$ 表示以 你好 结尾 - \b 单词边界 表示匹配除[a-zA-Z0-9_]之外的字符
\bis\b 可以匹配 @is@ 不能匹配 aisa - \B 非单词边界 表示匹配[a-zA-Z0-9_]字符 匹配 aisa
简写字符集
- . 表示除换行符之外的字符
- \w 匹配所有字母数字 [a-zA-Z0-9_]
- \W 匹配所有非字符数字 [^\w]
- \d 匹配数字 [0-9]
- \D 匹配非数字 [^\d]
- \s 匹配所有空格 [\t\n\f\r\p{Z}]
- \S 匹配非空格 [^\s]
零宽度断言
pattern表示正则表达式
- 正向先行断言 ?=pattern 匹配某个模式之后的内容 不包含模式本身
如:要匹配数字之后的字母 \d(?=[a-zA-Z]) "3a 4b 5c"可以匹配的3 4 5 - 负向先行断言 ?!pattern 匹配某个模式之后不是特定的内容
如:\d(?![a-z]) "3a 4@ 5C" 可以匹配到4 5 - 正向后行断言 ?<=pattern 匹配某种模式之前的内容 不包含模式本身
如:要匹配数字之前的字母 (?<=[a-z])\d "a3 b4 c5" 可以匹配到 3 4 5 - 负向后行断言 ?<!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 表示在每行的结尾都查询你好
贪婪匹配 .?
正则默认贪婪匹配
.* 表示匹配尽可能长的字符串
惰性匹配 .?*
表示只匹配第一个字符串