正则表达式篇
一、正则表达式概述
正则表达式是一种强大的文本处理工具,可以精确地描述要匹配的字符组合,使文本处理更加高效。它广泛应用于文本编辑、数据处理、网络编程等领域。
二、正则表达式基本命令字符
2.1 匹配与通配
-
/
:用于定界正则表达式,表示匹配模式的开始和结束。 -
.
:匹配除换行符以外的任意单个字符。-
示例:
/a.t/
可以匹配 "art"、"act" 等,其中 "a" 和 "t" 分别是固定的字符,中间的任意字符由.
匹配。
-
-
[]
:匹配括号内的任意一个字符。-
示例:
/[abc]/
可以匹配 "a"、"b" 或 "c"。 -
示例:
/[0-9]/
可以匹配任意一个数字字符。
-
2.2 范围与排除
-
-
:在方括号[]
中表示范围。-
示例:
/[a-z]/
可以匹配任意一个小写字母。 -
示例:
/[0-9a-f]/
可以匹配十六进制数字(0-9 和 a-f)。
-
-
^
:在方括号[]
中表示取反,匹配不在括号内的任意一个字符;在方括号外表示匹配每一行的开头。-
示例:
/[^0-9]/
匹配非数字字符。 -
示例:
/^Hello/
匹配以 "Hello" 开头的行。
-
2.3 字符类
-
\d
:匹配数字字符(等价于[0-9]
)。 -
\D
:匹配非数字字符(等价于[^0-9]
)。 -
\w
:匹配字母、下划线或数字字符(等价于[a-zA-Z0-9_]
)。 -
\W
:匹配非字母、下划线或数字字符(等价于[^a-zA-Z0-9_]
)。 -
\s
:匹配空白字符(包括空格、Tab 等)。 -
\S
:匹配非空白字符。 -
\b
:匹配单词边界。-
示例:
/\bword\b/
可以精确匹配整个单词 "word",而不会匹配到类似 "wording" 中的 "word"。
-
-
\B
:匹配非单词边界。 -
\.
:匹配点号,因为点号在正则中有特殊意义,需用转义字符\
表示其本身。
2.4 重复与数量词
-
+
:表示前面的字符重复一次或多次。-
示例:
/a+/
可以匹配 "a"、"aa"、"aaa" 等。
-
-
*
:表示前面的字符重复零次或多次。-
示例:
/a*/
可以匹配空字符串、"a"、"aa" 等。
-
-
?
:表示前面的字符重复零次或一次。-
示例:
/a?/
可以匹配空字符串或 "a"。
-
-
{n}
:表示匹配恰好n
次重复。-
示例:
/a{3}/
匹配 "aaa"。
-
-
{m,n}
:表示匹配至少m
次但不超过n
次重复。-
示例:
/a{2,4}/
可以匹配 "aa"、"aaa"、"aaaa"。
-
-
{n,}
:表示匹配至少n
次重复。-
示例:
/a{2,}/
可以匹配 "aa"、"aaa" 等。
-
2.5 特殊符号
-
$
:加在正则表达式后面表示匹配行尾。-
示例:
/end$/
匹配以 "end" 结尾的行。
-
2.6 分组与捕获
-
分组 :用括号
()
将多个字符组合成一个整体来处理。-
示例:
/(at)+/
匹配 "at" 重复一次或多次,如 "at"、"atat" 等。
-
-
捕获 :括号
()
也会捕获匹配的文本,可以通过\1
、\2
等反向引用捕获的内容。-
示例:
/(\d+)-(\d+)/
可以匹配 "123-456",其中\1
表示 "123",\2
表示 "456"。
-
2.7 选择
-
|
:表示逻辑或,匹配左边或右边的表达式。-
示例:
/abc|def/
可以匹配 "abc" 或 "def"。
-
2.8 前瞻与后顾
-
正向前瞻 :
(?=...)
,匹配当前位置后面紧跟指定模式的位置。-
示例:
/abc(?=def)/
匹配 "abc",但前提是 "abc" 后面跟着 "def",如 "abcdef" 中的 "abc"。
-
-
负向前瞻 :
(?!...)
,匹配当前位置后面不紧跟指定模式的位置。-
示例:
/abc(?!def)/
匹配 "abc",但前提是 "abc" 后面不跟着 "def",如 "abcxyz" 中的 "abc"。
-
-
正向后顾 :
(?<=...)
,匹配当前位置前面紧跟指定模式的位置。-
示例:
/(?<=abc)def/
匹配 "def",但前提是 "def" 前面跟着 "abc",如 "abcdef" 中的 "def"。
-
-
负向后顾 :
(?<!...)
,匹配当前位置前面不紧跟指定模式的位置。-
示例:
/(?<!abc)def/
匹配 "def",但前提是 "def" 前面不跟着 "abc",如 "xyzdef" 中的 "def"。
-
三、正则表达式应用示例
3.1 匹配邮箱地址
/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$/
-
解释:
^
表示行首,[a-zA-Z0-9_.+-]+
匹配邮箱用户名部分,@
是固定字符,[a-zA-Z0-9-]+
匹配域名部分,\.
匹配点号,最后的[a-zA-Z0-9-.]+
匹配顶级域名部分,$
表示行尾。
3.2 匹配电话号码
/^(?:\d{3}-\d{3}-\d{4}|\(\d{3}\) \d{3}-\d{4})$/
-
解释:
^
表示行首,(?:...)
表示非捕获分组,\d{3}-\d{3}-\d{4}
匹配三个数字加短横线的形式,\(\d{3}\) \d{3}-\d{4}
匹配带括号的形式,$
表示行尾。
3.3 使用 grep
命令搜索文本
grep "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$" contacts.txt
-
解释:在
contacts.txt
文件中搜索符合邮箱格式的行。
3.4 使用 sed
命令替换文本
echo "Hello, World!" | sed "s/World/Everyone/"
-
解释:将 "World" 替换为 "Everyone",输出 "Hello, Everyone!"。
3.5 使用 awk
命令处理文本
echo "Name: John, Age: 30" | awk -F ": " '{print $2}'
-
解释:使用
:
作为字段分隔符,打印第二个字段,输出 "John" 和 "30"。