admin 管理员组文章数量: 887042
2023年12月20日发(作者:java的开发环境安装与配置)
『正则表达式』概念 及在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}|1d{2}|2[0-4]d|25[0-5]).){3}(d{1,2}|1d{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-zd@$!%*?&]{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}]'
在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}'
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'
).then(response => {
let resultstring =
s[0].t;
let resultname =
s[0].;
3.2 在Python中使用正则表达式
可以使用Python的内置re模块来使用正则表达式。
re模块提供了Perl风格的正则表达式模式,使Python语言拥有全部的正则表达式功能。常用的正则表达式函数有:()、()、l()、()等。
•
():在字符串中查找模式,如果找到则返回Match对象,否则返回None。
•
():从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。
•
l():在字符串中查找模式,返回所有匹配到的字符串。
•
():用于替换字符串中的匹配项。
例5: 判断输入手机号是否正确
import re
def judge_phone_number(account):
pattern = repile(r"^1([3-9])d{9}$")
if (account):
print("手机号码输入正确")
else:
print("手机号码输入错误")
judge_phone_number(input("请输入手机号:"))
注:
Python个中的正则表达式放在单、双引号里面,前面加一个r表示原始字符串,不进行转义。
正则表达式一般放在//里面,不同语言有一些区别。
3.3 在C语言中使用正则表达式
在C语言中,可以使用POSIX标准库中的正则表达式库regex.h来编写和处理正则表达式。
C语言中处理正则表达式的函数有regp()、regexec()、regfree()和regerror()等。
3.31 函数介绍
•
regp()函数:编译正则表达式。函数原型如下:
int regp(regex_t *preg, const char *regex, int cflags);
其中,preg是一个指向regex_t类型的指针,regex是一个指向正则表达式字符串的指针,cflags是编译标志。如果函数执行成功,返回值为0;否则,返回值为非0。
int regexec(const regex_t *preg, const char *string,
size_t nmatch, regmatch_t pmatch[], int eflags);
其中,preg是一个指向regex_t类型的指针,string是一个指向待匹配字符串的指针,nmatch是pmatch数组的长度,pmatch是一个指向regmatch_t类型的数组,eflags是执行标志。如果函数执行成功,返回值为0;否则,返回值为非0。
void regfree(regex_t *preg);
其中,preg是一个指向regex_t类型的指针。
•
regerror()函数:获取包含错误信息的字符串。函数原型如下:
size_t regerror(int errcode, const regex_t *preg, char
*errbuf, size_t errbuf_size);
其中,errcode是错误代码,preg是一个指向regex_t类型的指针,errbuf是一个指向字符数组的指针,errbuf_size是字符数组的长度。如果函数执行成功,返回值为错误信息字符串的长度;否则,返回值为0。
3.32 例程
#include
#include
#include
#include
int main (void)
{
char ebuff[256];
int ret;
int cflags;
regex_t reg;
cflags = REG_EXTENDED | REG_ICASE | REG_NOSUB;
char *test_str = "Hello World";
char *reg_str = "H.*";
ret = regp(®, reg_str, cflags);
if (ret)
{
regerror(ret, ®, ebuff, 256);
fprintf(stderr, "%sn", ebuff);
goto end;
}
ret = regexec(®, test_str, 0, NULL, 0);
if (ret)
{
regerror(ret, ®, ebuff, 256);
fprintf(stderr, "%sn", ebuff);
goto end;
}
regerror(ret, ®, ebuff, 256);
fprintf(stderr, "result is:n%sn", ebuff);
end:
regfree(®);
return 0;
}
版权声明:本文标题:『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/free/1703013449h439656.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论