正则表达式: Regular Expression
字符串是计算机应用中最广泛的处理对象之一,(网页,文档),并且
字符串组合规则形式多样,比如
数字字符串
C语言标识符
IP地址字符串
URL字符串(统一资源定位符)
。。。
上面这些都是我们程序设计需要处理的对象,现在的问题是:计算机要处理这些
字符串,首先需要某种语言去描述这些字符串的规则
==>正则表达式,它就是描述某一特定规则的表达式
[0-9]+ 代表数字
正则表达式的字符组成
正则表达式是由一些字符去描述规则,在正则表达式中有两类字符
(1)元字符(Meta Character):不代表自己,代表某个特定的字符或多个字符
(2)普通字符:仅代表自身的字符. \元字符 ==> 普通字符
正则表达式有不同的流派(Egrep,java,C#)很多语言都用到了正则表达式,但是这些语言
中用来描述字符串规则的"元字符"不是都一样的,我们称正则表达式有不同的流派。
元字符(Meta Character):不代表自己,代表某个特定的字符或多个字符
. 匹配任意单个字符,英文字母,数字,。。。以及它本身
[] 字符组。从[]内任选一个字符 如[0-9]代表任意一个数字字符
[^] 字符组。从[]外任选一个字符 如[^0-9]代表任意一个非数字字符
注意[]内只有- ^ 是元字符
\d digital 代表一个数字字符 \d <=> [0-9]
\D digital 代表一个非数字字符 \D <=> [^0-9]
\w 匹配字母、数字、下划线 [a-zA-Z0-9_]
\W 匹配非字母、数字、下划线 [^a-zA-Z0-9_]
\s 匹配空白字符 [\n\t\r\f]
\S 匹配非空白字符 [^\n\r\r\f]
\b 匹配单词边界
eg: \bword\b
"hello word 123" ==> 匹配
"helloword123" ==> 不匹配
* 匹配0个或多个先前字符(先前模式) 如 .* 表示任意字符串
[a-zA-Z_][a-zA-Z0-9_]* 表示匹配C标识符
?匹配0个或1个先前字符(先前模式) 如 a? 匹配 空 或 a
+ 匹配一个或多个先前字符(先前模式) 如 a+ 匹配 a aa aaa aaaa ..
{数字} 匹配固定数目的先前字符(先前模式) 如 a{5} 匹配 aaaaa
{最小数目,最大数目} 如 a{1,3} 匹配 a aa aaa
{最小数目,} 如 a{3,} 匹配 aaa aaaa ....
() 作为一个整体,子模式, 如(abc){1,3}
==> abc
abcabc
abcabcabc
| 二选一 如 (abc | 123) 匹配 abc 或 123
(abc | 123 | 456) 匹配 abc 或 123 或 456
^ 匹配行首 ^a匹配以a开头的行
$ 匹配行尾 a$匹配以a结尾的行
练习:用正则表达式描述IPV4的网络地址
([0-9]{1,3}\.){3}[0-9]{1,3}
grep命令:
grep(egrep):用来在文本文件里查一个特定的字符串,
egrep用的是扩展的正则表达式
grep options "正则表达式" filenames
options:
-n 显示行号
-E egrep用的是扩展的正则表达式
-i ignore 在字符串比较时忽略大小写
-# 表示同时显示匹配行的上下行
-c count 打印每个文件里匹配行的个数
--color=always 高亮显示
--color=never 不高亮显示
--color=auto 自动
-H 显示文件名
-h 不显示文件名
eg:
grep -n -E --color=always -H "([0-9]{1,3}\.){3}[0-9]{1,3}" 1.txt
练习: 查找1.txt 里的大于1000的数字
grep -n -E --color=always -h "[1-9][0-9]{3,}" 1.txt