正则表达式一些入门知识,还有在牛客遇到的题目。
正则表达式是一个强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。
作用
- 测试字符串内的模式。
例如,可以测试输入字符串,以查看字符串内是否出现电话号码模式或信用卡号码模式。这称为数据验证。 - 替换文本。
可以使用正则表达式来识别文档中的特定文本,完全删除该文本或者用其他文本替换它。 - 基于模式匹配从字符串中提取子字符串。
可以查找文档内或输入域内特定的文本。
语法
匹配单个字符
. 可以用来匹配任何的单个字符,但是在绝大多数实现里面,不能匹配换行符;如果需要匹配 . ,那么要用 \ 进行转义,即在 . 前面加上 \ 。
1 | z.y # 匹配结果 zty |
匹配一组字符
[ ] 定义一个字符集合;0-9、a-z 定义了一个字符区间,区间使用 ASCII 码来确定,字符区间在 [ ] 中使用。
- 只有在 [ ] 之间才是元字符,在 [ ] 之外就是一个普通字符;
^ 在 [ ] 中是取非操作。
1 | abc[^0-9] # 匹配以abc为开头,并且最后一个字母不为数字的字符串 |
使用元字符
匹配特定字符
-
数字元字符
元字符 说明 \d 数字字符,等价于 [0-9] \D 非数字字符,等价于 [^0-9] -
字母数字元字符
元字符 说明 \w 大小写字母,下划线和数字,等价于 [a-zA-Z0-9_] \W 对 \w 取非 -
空白字符元字符
元字符 说明 \s 任何一个空白字符,等价于 [\f\n\r\t\v] \S 对 \s 取非 \x 匹配十六进制字符,\0 匹配八进制,例如 \xA 对应值为 10 的 ASCII 字符 ,即 \n。
重复匹配
- + 匹配 1 个或者多个字符
- \ * 匹配 0 个或者多个字符
- ? 匹配 0 个或者 1 个字符
1 | [\w.]+@\w+\.\w+ # 匹配邮箱地址 [\w.] 匹配的是字母数字或者 . ,在其后面加上 + ,表示匹配多次。在字符集合 [ ] 里,. 不是元字符; |
位置匹配
单词匹配
\b 可以匹配一个单词的边界,边界是指位于 \w 和 \W 之间的位置;\B 匹配一个不是单词边界的位置。
\b 只匹配位置,不匹配字符,因此 \babc\b 匹配出来的结果为 3 个字符。
字符串边界
^ 匹配整个字符串的开头,$ 匹配结尾。
^ 元字符在字符集合中用作求非,在字符集合外用作匹配字符串的开头。
分行匹配模式(multiline)下,换行被当做字符串的边界。
1 | ^\s*\/\/.*$ # 匹配代码中以 // 开始的注释行 |
使用子表达式
使用 ( ) 定义一个子表达式。子表达式的内容可以当成一个独立元素,即可以将它看成一个字符,并且使用 * 等元字符。
1 | (ab){2,} # abababab |
| 是或元字符,它把左边和右边所有的部分都看成单独的两个部分,两个部分只要有一个匹配就行。
1 | (19|20)\d{2} # 1900 2010 |
1 | ((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d)) |
回溯引用
回溯引用使用 \n 来引用某个子表达式,其中 n 代表的是子表达式的序号,从 1 开始。它和子表达式匹配的内容一致,比如子表达式匹配到 abc,那么回溯引用部分也需要匹配 abc 。
1 | <(h[1-6])>\w*?<\/\1> # 匹配html前后标签一致的合法标签,如<h1>dsdad</h1> |
替换
1 | (\d{3})(-)(\d{3})(-)(\d{4}) |
大小写转换
元字符 | 说明 |
---|---|
\l | 把下个字符转换为小写 |
\u | 把下个字符转换为大写 |
\L | 把\L 和\E 之间的字符全部转换为小写 |
\U | 把\U 和\E 之间的字符全部转换为大写 |
\E | 结束\L 或者\U |
1 | (\w)(\w{2})(\w) |
相关题目[牛客]
1 | 15位身份证的构成:六位出生地区码+六位出身日期码+三位顺序码 |
1 | http://www.bilibili.com/video/av21061574 |