分枝条件):
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码: 一种是三位区号, 8 位本地号(如 010-12345678), 一种是 4 位区号, 7 位本地号(0376-2233445)
分组):
- [root@localhost test]# ifconfig | egrep -o "([[:digit:]]{1,3}\.){3}[[:digit:]]"
- 192.168.3.1
- 192.168.3.2
- 255.255.255.0
- 127.0.0.1
- 255.0.0.0
- ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) // 匹配 ip 地址
- [root@localhost test]# ifconfig |egrep -o "(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?\.){3}(2[0-4][0-9]|25[0-5]|[01]?[0-9][0-9]?)"
反义):
\W 匹配任意不是字母, 数字, 下划线, 汉字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非数字的字符
\B 匹配不是单词开头或结束的位置
[^x] 匹配除了 x 以外的任意字符
[^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符
例子:\S + 匹配不包含空白符的字符串
<a[^>]+>匹配用尖括号括起来的以 a 开头的字符串
后向应用):
后向引用用于重复搜索前面某个分组匹配的文本例如,\1 代表分组 1 匹配的文本
\b(\w+)\b\s+\1\b 可以用来匹配重复的单词, 像 go go, 或者 kitty kitty
常用分组语法): // 分类 代码 / 语法 说明
==============================================================
捕获
(exp) 匹配 exp, 并捕获文本到自动命名的组里
(?<name>exp) 匹配 exp, 并捕获文本到名称为 name 的组里, 也可以写成(?'name'exp)
(?:exp) 匹配 exp, 不捕获匹配的文本, 也不给此分组分配组号
零宽断言
(?=exp) 匹配 exp 前面的位置
(?<=exp) 匹配 exp 后面的位置
(?!exp) 匹配后面跟的不是 exp 的位置
(?<!exp) 匹配前面不是 exp 的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响, 用于提供注释让人阅读
第三个 (?:exp) 不会改变正则表达式的处理方式, 只是这样的组匹配的内容不会像前两种那样被捕获到某个组里面, 也不会拥有组号
贪婪与懒惰):
当正则表达式中包含能接受重复的限定符时, 通常的行为是 (在使整个表达式能得到匹配的前提下) 匹配尽可能多的字符以这个表达式为例: a.*b, 它将会匹配最长的以 a 开始, 以 b 结束的字符串如果用它来搜索 aabab 的话, 它会匹配整个字符串 aabab 这被称为贪婪匹配
加入需要懒惰匹配, 也就是匹配尽可能少的字符前面给出的限定符都可以被转化为懒惰匹配模式, 只要在它后面加上一个问号? 这样.*? 就意味着匹配任意数量的重复
但是在能使整个匹配成功的前提下使用最少的重复现在看看懒惰版的例子吧:
- [root@localhost test]# echo "aababaab" |grep -oP "a.*b"
- aababaab
- [root@localhost test]# echo "aababaab" |grep -oP "a.*?b"
- aab
- ab
- aab
懒惰限定符:// 尚未理解到位
代码 / 语法 说明
*? 重复任意次, 但尽可能少重复
+? 重复 1 次或更多次, 但尽可能少重复
?? 重复 0 次或 1 次, 但尽可能少重复
{n,m}? 重复 n 到 m 次, 但尽可能少重复
{n,}? 重复 n 次以上, 但尽可能少重复
- #echo "123,123,123,123" |grep -oP "(\d{1,3})?"
- 123
- #echo "123,456,123,789" |grep -oP "(\d{1,3}\,){1,}?"
- 123,
- 456,
- 123,
- [root@c43a02001.cloud.a02.amtest1221 /root] //{n,}? 用法
- #echo "123,456,123,789" |grep -oP "(\d{1,3}\,){1,}"
- 123,456,123,
- [root@a27g12213.cloud.g14.god7 /root] // 零宽对比
- #echo "123,456,123,789" |grep -oP "(?<=^).*(?=,)"
- 123,456,123
- [root@a27g12213.cloud.g14.god7 /root]
- #echo "123,456,123,789" |grep -oP "(?<=^).*?(?=,)"
- 123
来源: http://www.bubuko.com/infodetail-2511272.html