目录
正则表达式
可以理解为是规则表达式,通过代码中用字符串编写的表达式规定一种字符串的规则(格式),限定字符串中指定类型的字符出现的顺序和次数。
通配符
配符是用于文件名匹配和选择的特殊字符。通配符允许根据模式匹配文件名,以便执行各种文件操作
-
*
(星号):匹配零个或多个字符。例如,*.txt
匹配所有以 ".txt" 结尾的文件。 -
?
(问号):匹配任何单个字符。例如,file?.txt
匹配 "file1.txt"、"fileA.txt" 等。 -
[]
(方括号):用于指定字符类,匹配其中任何一个字符。例如,[aeiou]
匹配任何元音字母,[0-9]
匹配任何数字。 -
[!]
或[^]
:否定字符类,匹配未包含在方括号内的任何字符。例如,[!aeiou]
或[^aeiou]
匹配非元音字母。 -
{}
(花括号):用于创建一个组合模式,可以匹配其中任何一个模式。例如,{file1,file2}.txt
匹配 "file1.txt" 或 "file2.txt"。
元字符
元字符(Metacharacters)是具有特殊含义的字符,用于定义模式匹配规则。
-
.
(句点):匹配任何单个字符,除了换行符。例如,a.b
匹配 "axb"、"ayb" 等。 -
*
(星号):匹配前一个字符的零次或多次出现。例如,a*
匹配 ""(空字符串)、"a"、"aa" 等。 -
+
(加号):匹配前一个字符的一次或多次出现。例如,a+
匹配 "a"、"aa"、但不匹配 ""。 -
?
(问号):匹配前一个字符的零次或一次出现。例如,a?
匹配 "" 或 "a"。 -
[]
(方括号):用于指定字符类,匹配其中任何一个字符。例如,[aeiou]
匹配任何元音字母。 -
[^]
或[^]
:否定字符类,匹配未包含在方括号内的任何字符。例如,[^0-9]
匹配任何非数字字符。 -
[[:blank:]]
:匹配空格字符和制表符(tab)字符。这个字符类是一种更通用的方式来匹配空白字符,而不仅仅是空格字符。 -
[[:digit:]]
:匹配任何数字字符。 -
[[:alpha:]]
:匹配任何字母字符。 -
[[:alnum:]]
:匹配任何字母或数字字符。 -
[[:space:]]
:匹配任何空白字符,包括空格、制表符、换行符等。 -
[:cntrl:]
不可打印的控制字符(退格、删除、警铃…) -
[:digit:]
十进制数字 -
[:xdigit:]
十六进制数字 -
[:graph:]
可打印的非空白字符 -
[:print:]
可打印字符 -
[:punct:]
标点符号
-
^
(插入符号):在模式的开头匹配字符串的开头,用于匹配行的开头。例如,^abc
匹配以 "abc" 开头的字符串。 -
$
(美元符号):在模式的末尾匹配字符串的末尾,用于匹配行的结尾。例如,xyz$
匹配以 "xyz" 结尾的字符串。 -
\
(反斜杠):用于转义元字符,使其失去特殊含义。例如,\.
匹配实际的句点字符。\w #匹配单词构成部分,等价于[[:alnum:]] \W#匹配非单词构成部分,等价于[^[:alnum:]] \S #匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \s #匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
-
|
(管道符号):用于指定多个模式之间的"或"关系。例如,cat|dog
匹配 "cat" 或 "dog"。 -
()
(圆括号):用于创建子表达式,可以用于分组\(\)
和捕获匹配的内容。
匹配次数
*
:匹配前面的字符任意次,包括0次。尽可能长的匹配
.*
:匹配前面的任意字符任意次,但是不包括0次
\?
:匹配前面的字符,出现0次或者1次,可有可无
\+
:匹配前面出现的字符最少1次,最多无限次
\{n\}
:表示前面的字符只能出现n次
\{n,m\}
:表示前面字符最少出现n次,最多出现m次
\{,n\}
:表示前面的字符最多出现n次,≤n
\{n,\}
:表示前面的字符最少出现n次,≥n
位置锚定
位置锚定是指用于定位过滤条件出现位置的特殊字符或符号。以下是一些常用的位置锚定符号:
^
:行首锚定(最左侧)。例如,'^grep'匹配所有以grep开头的行。
$
:行尾锚定(最右侧)。例如,'grep$'匹配所有以grep结尾的行。
^$
:空行。
^字符$
:匹配整行,而且整行只有这个字符
^[[:space:]]*$
:空白字符行。
\<
:字首锚定,用于单词模式的左侧(连续的字符,数字,下划线都算单词内部),从左往右完整单词最多到-
\>
:字尾锚定,用于单词模式的右侧,从右往左有一个算一个
\<字符>\
:匹配单词,
\b
:单词边界锚定,用于匹配单词的边界。例如,\bgrep\b
可以匹配独立的单词“grep”。
使用这些位置锚定符号可以更精确地匹配和定位文本中的特定模式或位置。在Linux系统中,常用的工具如grep
、sed
和awk
等支持正则表达式的应用,可以利用这些位置锚定来进行文本处理和筛选。
逻辑或
|
表示“或”逻辑。它允许你指定多个模式中的任意一个。例如,(http|https):\/\/
匹配以 "http://" 或 "https://" 开头的字符串。
扩展正则表达式
扩展正则表达式是一种正则表达式语法,用于在Linux操作系统中进行文本匹配和处理。扩展正则表达式相对于基本正则表达式(BRE)增加了一些功能,使其更强大和灵活。以下是一些扩展正则表达式的常见元字符和用法:
-
()
:用于分组表达式,以便对其进行子表达式匹配和捕获。 -
{}
:指定出现的次数,例如{n}
表示前一个元素必须出现 exactly n 次,{n,}
表示至少出现 n 次,{n,m}
表示出现次数在 n 和 m 之间。 -
?
:表示前一个元素可选,出现 0 次或 1 次。 -
+
:表示前一个元素必须出现至少一次。 -
*
:表示前一个元素可以出现 0 次或多次。 -
|
:用于表示或逻辑,匹配其中一个表达式。 -
[]
:用于创建字符类,匹配方括号中的任何一个字符。例如,[abc]
匹配 'a'、'b' 或 'c' 中的任何一个字符。 -
.
:匹配除了换行符之外的任何字符。 -
^
:匹配行的开头。 -
$
:匹配行的结尾。 -
\
:用于转义特殊字符,使其失去特殊含义。例如,\.
匹配实际的句点字符。
这些扩展正则表达式元字符允许您更精确地控制匹配模式,可以用于处理更复杂的文本匹配需求。例如,您可以使用 {}
来指定特定次数的重复,或者使用 ()
来分组子表达式以便后续引用。扩展正则表达式通常在工具如grep
、sed
和awk
中广泛使用,用于文本处理和搜索。
扩展正则和普通正则的区别
扩展正则表达式(Extended Regular Expression,ERE)和基本正则表达式(Basic Regular Expression,BRE)是用于文本匹配和处理的两种不同正则表达式语法。它们在功能上有一些区别,主要体现在支持的元字符和语法上。
以下是扩展正则表达式(ERE)和基本正则表达式(BRE)之间的主要区别:
元字符的默认行为:
-
ERE:在扩展正则表达式中,元字符(如
+
,?
,|
,()
等)具有特殊含义,不需要使用反斜杠\
进行转义。它们默认表示它们的特殊含义。 -
BRE:在基本正则表达式中,大多数元字符默认不具有特殊含义,需要使用反斜杠
\
进行转义,以表示它们的特殊含义。例如,+
在BRE中表示字面字符,而不是一个或多个重复。
+
和 ?
的行为:
-
ERE:
+
表示前面的元素出现一次或多次,?
表示前面的元素出现零次或一次。 -
BRE:
+
和?
表示它们自身,如果要表示重复或可选性,需要使用\+
和\?
。
分组和子表达式:
-
ERE:支持使用圆括号
()
进行子表达式分组,用于捕获和分组。 -
BRE:圆括号
()
在基本正则表达式中没有特殊含义,如果需要分组,必须使用\(
和\)
。
管道符号 |
的行为:
-
ERE:
|
表示逻辑或操作符。 -
BRE:
|
在基本正则表达式中表示字面字符,要表示逻辑或,需要使用\|
。
花括号 {}
的行为:
-
ERE:
{}
用于指定重复次数,例如{n}
表示前面的元素重复 n 次。 -
BRE:花括号
{}
在基本正则表达式中没有特殊含义,如果要表示重复次数,需要使用\{
和\}
。
通常,ERE更强大且更易于使用,因为它不需要对许多特殊字符进行转义,而BRE更受限制。你可以在使用正则表达式的上下文中选择适合你需求的正则表达式语法,具体取决于你的目标和所使用的工具或编程语言。