正则表达式篇
一、正则表达式概述
正则表达式是一种强大的文本处理工具,可以精确地描述要匹配的字符组合,使文本处理更加高效。它广泛应用于文本编辑、数据处理、网络编程等领域。
二、正则表达式基本命令字符
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"。
