正则表达式(Regular Expression,RE)
正则表达式是通过一些特殊字符的排列,用以字串处理的表达式,正则表达式本身并不是一个工具程序,而实一个字串处理的标准依据,如果想要以正则表达式的方式处理字串,就需要使用支持正则表达式的工具程序,如vi,grep,sed,awk等
正则表达式可以在文本中查找、替换、提取和验证特定的模式
以行为单位来进行字串的处理行为
基础正则表达式
不同的语系将会影响到正则表达式的输出结果:由于不同语系的编码数据并不相同,所以就会造成数据选择结果的不同。
- LANG = C时:0 1 2 3 4 ... A B C D ... Z a b c d ... z
- LANG = zh_TW时:0 1 2 3 4 ... a A b B c C d D ... z Z
一般我们在练习正则表达式时,使用的是相容于POSIX的标准,因此使用c
这个语系
1.特殊符号
特殊符号 | 意义 |
---|---|
[:alnum:] | 0-9, a-z, A-Z |
[:alpha:] | a-z, A-Z |
[:blank:] | 空格键和Tab 键 |
[:cntrl:] | 键盘上的控制按键 |
[:digit:] | 0-9 |
[:graph:] | 除了空格键和Tab 键的其他所有按键 |
[:lower:] | a-z |
[:upper:] | A-Z |
[:print:] | 任何可以被打印出来的字符 |
[:punct:] | 标点符号 |
[:space:] | 任何会产生空白的字符 |
[:xdigit:] | 代表16进制的数字类型,故包括0-9,a-f,A-F |
2.普通字符
普通字符包括没有显示指定为元字符的所有可打印和不可打印字符,这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号
[string]
匹配[...]
中的所有字符[^string]
匹配除了[...]
中字符的所有字符[a-z]
匹配一个区间.
匹配除换行符之外的任何单个字符,相等于[^\n\r]
\s\S
匹配所有,\s
是匹配所有空白符,包括换行,\S
非空白符,不包括换行\w
匹配字母,数字,下划线,等价于[A-Za-z0-9_]\d
匹配任意一个阿拉伯数字,等价于[0-9]
3.特殊字符
有特殊含义的字符,若要匹配这些特殊字符,必须首先使字符转义,即将反斜杠字符\
放在他们前面
()
标记一个子表达式的开始和结束位置.
匹配除换行符之外的任何单字符[
标记一个中括号表达式的开始\
将下一个字符标记为特殊字符或原义字符,或向后引用,或八进制转义符{
标记限定符表达式的开始|
指明两项之间的一个选择
4.限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配
{n}
匹配确定的n次,其中n是一个非负整数{n,}
至少匹配n次{n,m}
最少匹配n次且最多匹配m次*
匹配前面的子表达式零次或多次,等价于{0,}
+
匹配前面的子表达式一次或多次,等价于{1,}
?
匹配前面的子表达式零次或一次,等价于{0,1}
*
和+
限定符都是贪婪的,因为他们会尽可能多地匹配文字,只有在他们后面加上一个?
就可以实现非贪婪或最小匹配
5.定位符
能够将正则表达式固定到行首或行尾
^
匹配输入字符串的开始位置$
匹配输入字符串的结尾位置\b
匹配一个单词边界,即字与空格间的位置\B
非单词边界匹配
不能将限定符与定位符一起使用,
6.选择
用圆括号()
将所有选择项括起来,相邻的选择项之间用|
分隔,但使用圆括号会有一个副作用,使相关的匹配会被缓存,可以使用非捕获元来消除这种副作用
7.非打印字符
/cx
匹配由x指明的控制字符,其中x的值为a-z或A-Z\f
匹配一个换页符\n
匹配一个换行符\r
匹配一个回车符\s
匹配任何空白字符\S
匹配任何非空白字符\t
匹配一个制表符\v
匹配一个垂直制表符
例子(动态更新)
- 1.匹配一个正整数:
[1-9][0-9]*
- 2.匹配1~99的两位数:
[1-9][0-9]?