如何做
- 整合之前学习成果。包括 evernote、youdaonode 里面的东西。
- 探索 Linux 里面的正则表达式
- python 里面的正则表达式
- Java 里面的正则表达式
- 通用型的正则表达式
好的学习资源
基础的部分
-
元字符,就是组成计算所有文本的基本元素,例如,字符、标点符号、文字,总之,就是我们能在键盘上敲出来的东西
-
重复,描述了让元字符重复多少次的语法
-
描述开头和结束的语法
-
描述范围的语法
-
或逻辑
-
分组
-
简写字符集
.
代表所有的字符
\w
(word) 代表所有的字母和数字,相当于 [a-zA-Z0-9_]
在下面的图中,我们看到键盘上的字母、数字和_
都匹配上了。
\W
和\w
正好相反,只要\w
匹配不到得,\W
都能匹配上
如下所示,空格和所有键盘上非字母的字符都匹配上了,不过还有一个漏网之鱼 _
,这个哥们是在 \w
里面的
\d
(digital) 匹配数字,类似 [0-9]
\D
(non-digital) 不是数字的那些字符,[^0-9]
如下图,只有数字没有匹配到
\f
匹配一个换页符
目前还没有找到这个字符如何
\n
匹配一个符号,这个符号代表了一个新行的开始
如下图所示,有 7 行,\n
匹配到 6 个新行的开始
>
\r
匹配一个回车字符
目前没有用到。
\t
制表符
\v
匹配一个垂直制表符
用的不多
\p
匹配 CR/LF(等同于 \r\n),用来匹配 DOS 行终止符
用的不多
\b
Matches, without consuming any characters, immediately between a character matched by \w and a character not matched by \w (in either order). It cannot be used to separate non words from words.
\b
只能和字符(\w
)组合使用,表示字符的后面是 \W
,如下图所示,第一个 t 没有匹配上,后面都匹配上了,\b
不会匹配任何字符,只是作为一个参照。
\B
, 匹配那些\b
匹配不到的\w
如下图所示,后面有空格的 a 没有匹配上。\b
不匹配任何的字符,只是做为一个参照,在下面的图中只匹配到了 a
8. 转义,一般的情况,我们可以是 \
来将特殊的字符转成普通字符
如下图所示,(
和)
是分组含义,在正则表达的保留字符,在保留字符的前面加上\
就可以匹配了。
\s
匹配所有空格字符,等同于: [\t\n\f\r\p{Z}]
\s 代表所有不可见字符。
\S
,就是 [^\s]
进阶的部分
- 零宽断言
符号 | 描述 |
---|---|
?= | 正先行断言-存在 |
?! | 负先行断言-排除 |
?<= | 正后发断言-存在 |
?<! | 负后发断言-排除 |
有的时候,我们之前匹配到的两种字符串之间的字符串,例如,
select * from table_name where field_name = 'aaa' ;
想从上面这个字符串里面匹配到 table_name。
.*(?=\swhere)
(?<=from\s).*(?=\swhere)
\\1' , '\\1')
- 贪婪和非贪婪
- 反义
select regexp_replace('18712344321' , '(?<=\\d{3})\\d{4}(?=\\d{4})' , '****')
select regexp_replace('2020-01-01' , '(20)\\1' , '')
select regexp_replace('2020-01-01 00:00:00' , '[-: ]' , '')
select regexp_replace('2020-01-01 00:00:00' , '[-: ]' , '')
select regexp_replace('2020-01-01 00:00:00' , '(?<=\\d{4}-\\d{2}-\\d{2}).*' ,'')
select regexp_replace('00:00' , '\\d{2}:00' , '' )
select regexp_replace('hello world' , '(hello|world)' , '')
select regexp_extract('hello world' , '(hello|world)')