『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
一、元字符
正则表达式语法中使用的主要元字符包括:
。(点):匹配除换行符之外的任何字符。
^ (脱字符):匹配输入字符串的开始位置。
$ (美元符号):匹配输入字符串的结束位置。
*(星号):匹配前面的子表达式零次或多次。
+(加号):匹配前面的子表达式一次或多次。
? (问号):匹配前面的子表达式零次或一次。
{n}:n 是一个非负整数。匹配确定的 n 次。
{n,}:n 是一个非负整数。至少匹配 n 次。
{n,m}:m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。
[…]:字符集合。匹配方括号中包含的任意字符。
[^…]:负值字符集合。匹配方括号中不包含的任意字符。
还有:
1.“|”:或,匹配左右两边任意一个表达式
2.“”:转义字符,用于转义特殊字符,使其具有原本的字符意义,例如匹配字符".“,需要使用”.“而不是”."。
3.“\d”:匹配数字,相当于字符集[0-9]。
4.“\D”:匹配非数字字符,相当于字符集[^0-9]。
5.“\w”:匹配单词字符,包括数字、字母和下划线,相当于字符集[A-Za-z0-9_]。
6.“\W”:匹配非单词字符,相当于字符集[^A-Za-z0-9_]。
7.“\s”:匹配空白字符,包括空格、制表符和换行符等。
8.“\S”:匹配非空白字符。
9.“(?=exp)”:前向肯定断言,匹配exp前面的位置。
10.“(?!exp)”:前向否定断言,匹配非exp前面的位置。
二、常用正则表达式
使用正则表达式往往比我们写几行if-else这样的代码更加方便,以下是一些常用的正则表达式的参考(写法不唯一,且规则因国家、地区、开发语言而异):
1.匹配邮箱地址:
/^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
2.匹配手机号码:
3.匹配固定电话号码:
/^\d{3}-\d{8}|\d{4}-\d{7}$/
4.匹配身份证号码:
/^\d{17}[\d|X|x]|\d{15}$/
5.匹配日期格式(yyyy-mm-dd):
/^\d{4}-\d{1,2}-\d{1,2}$/
6.匹配中文字符:
7.匹配URL地址:
/^((http|https):\/\/)?([\w-]+\.)+[\w-]+(\/[\w-.\/?%&=]*)?$/
8.匹配:
9.匹配IP地址:
/^((\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])\.){3}(\d{1,2}|1\d{2}|2[0-4]\d|25[0-5])$/
10.匹配HTML标签:
11.匹配正整数:
12.匹配负整数:
13.匹配正数(包括小数):
14.匹配非正数(包括小数):
/^((-\d+(\.\d+)?)|(0+(\.0+)?))$/
15.匹配非负数(包括小数):
/^\d+(\.\d+)?|0+(\.0+)?$/
16.匹配16进制颜值:
/^#([0-9a-fA-f]{3}|[0-9a-fA-F]{6})$/
17.匹配密码强度(至少包含大写字母、小写字母、数字和特殊字符,长度至少为8位):
/^(?=.*[A-Z])(?=.*[a-z])(?=.*\d)(?=.*[@$!%*?&)])[A-Za-z\d@$!%*?&]{8,}$/
18.匹配车牌号码:
19.匹配域名:
/^([a-zA-Z0-9][-a-zA-Z0-9]{0,62}\.){1,}[a-zA-Z]{2,}$/
20.匹配时间格式(hh:mm:ss):
/^([01]\d|2[0-3]):[0-5]\d:[0-5]\d$/
三、使用示例
3.1 在 grep、awk、sed中使用正则表达式
正则表达式和grep、awk、sed非常搭配。
正则表达式提取中文例1: 使用grep匹配html文件中含有中文字符的行,并打印行号
grep -nP '[\x{4e00}-\x{9fa5}]' index.html
在grep中,使用Unicode字符范围来匹配中文需要使用16进制表示法,[\u4e00-\u9fa5]可以写成[\x{4e00}-\x{9fa5}]
例2: 使用awk匹配html文件中的块级标签:
例3:匹配html文件中的函数,并显示他们所在的行数
dahu@dahu MINGW64 ~/Desktop/gpt
dahu@dahu MINGW64 ~/Desktop/gpt
$ awk '/function/{print NR,$0}' index.html
145        function ask() {
247        function addText(text) {
251        function removeLine() {
257        function setCookie(name, value) {
269        function getCookie(name) {
279        function clear1() {
例4: 使用sed匹配含有response的行:
$ sed -n '/response/p' index.html
            ).then(response => {
                let resultstring = response.data.choices[0].t;
                let resultname = response.data.choices[0].le;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。