表达式选项
-G
--basic-regexp
基本正则表达式,默认选项
-E
--extended-regexp
扩展正则表达式
-F
--fixed-strings
作为字符串处理,不是识别为正则表达式
-P
--perl-regexp
Perl兼容正则表达式
语法
以扩展正则表达式为例。
基本结构
'.':匹配单个任意字符
'?':最多匹配前面的字符一次,0或者1
'*': 匹配前面的字符任意次
'+': 最少匹配前面的字符一次,1或者任意
'{n}': 正好匹配n次
'{n,}': 最少匹配n次
'{,m}': 最多匹配m次
'{n,m}': 最少匹配n次,最多匹配m次
字符类和括号表达式
‘[:alnum:]’
匹配字母和数字: ‘[:alpha:]’ and ‘[:digit:]’; 相当于: ‘[0-9A-Za-z]’.
‘[:alpha:]’
匹配字母包括大写字母和小写字母: ‘[:lower:]’ and ‘[:upper:]’; 相当于:‘[A-Za-z]’.
‘[:blank:]’
空白字符: 空格和制表符.
‘[:cntrl:]’
控制字符. 在ASCII表中,八进制的000~037以及177(DEL)表示的字符。
‘[:digit:]’
数字: 0 1 2 3 4 5 6 7 8 9.
‘[:graph:]’
图形字符: ‘[:alnum:]’ and ‘[:punct:]’.
‘[:lower:]’
小写字母; a b c d e f g h i j k l m n o p q r s t u v w x y z.
‘[:print:]’
可打印字符: ‘[:alnum:]’, ‘[:punct:]’, 空格.
‘[:punct:]’
标点符号: ! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~.
‘[:space:]’
空白字符: 制表符,换行符,垂直制表符,换页,回车,空格。
‘[:upper:]’
大小字母: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z.
‘[:xdigit:]’
十六进制数字: 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f.
反斜杠字符和特殊字符
‘\’ 后面跟一些普通字母时,会有特殊含义,这些特殊字母如下:
‘\b’
匹配单词边缘的空白字符串.
‘\B’
匹配不在单词边缘的空白字符串.
‘\<’
匹配单词开头的空字符串.
‘\>’
匹配单词末尾的空字符串.
‘\w’
匹配单词成分,类似于C语言中的标识符组成规则,由下划线,字母,数字组成,等同于‘[_[:alnum:]]’.
‘\W’
匹配非单词成分,等同于 ‘[^_[:alnum:]]’.
‘\s’
匹配空白字符,等同于 ‘[[:space:]]’.
‘\S’
匹配非空白字符,等同于 ‘[^[:space:]]’.
比如'\brat\b'只会匹配单独的单词'rat','\Brat\B'可以匹配'crate'但是不会匹配'full rat'
锚定
插入符号 '^' 和美元符号 '$' 是元字符,分别匹配行首和行尾的空字符串。它们被称为锚点,因为它们分别强制匹配“锚定”到一行的开头或结尾。
反向引用和子表达式
反向引用 '\ n',其中n是单个数字,匹配之前由正则表达式的第n个括号子表达式匹配的子字符串。例如, '(a)\1' 匹配 'aa'。当与备选符号'|'一起使用时,如果该组不参与匹配,则反向引用会使整个匹配失败。例如, 'a(.)|b\1'不会匹配'ba'。
针对'a(.)|b\1'的理解比较拗口,这里其实是两组表达式,第一组'a(.)'和第二组'b\1',第二组中找不到对应的子表达式,导致第二组会直接失效。
BRE和ERE的区别
在基本正则表达式中,这些字符没有特殊含义: ‘?’, ‘+’, ‘{’, ‘|’, ‘(’, and ‘)’
想要有特殊含义需要使用: ‘\?’, ‘\+’, ‘\{’, ‘\|’, ‘\(’, and ‘\)’.
也就是在基本正则表示中'+'会直接匹配'+',想要表示至少匹配一次的含义需要使用'\+'