2025-01-20
通配符与正则匹配
首先直接介绍两个名词的直接含义
通配符
一般指在UNIX或者类UNIX系统中,简单匹配文件的符号,用于“通用匹配”文件中的部分内容来指一系列文件,比如alpha.c,beta.c,common.c都可以用*.c这样的通配符辅助的文件名来一起指代,起到一个类似于“筛选”的作用
正则匹配
正则匹配在语义上来讲,和通配的原理相似,但是更加的广泛且功能强大(Regular Expression,简称regex)用于更复杂的文本匹配,常见于编程和文本处理。正则表达式功能强大,支持多种模式匹配规则
在UNIX通配符中,最常用的还是 * 和 ? 前者可以替代一或多个字符,后者只能匹配单个字符
例如,在您的unixstuff 目录中,键入(%为终端指示)
%ls list*
这将列出当前目录中以list ... 开头的所有文件。
尝试输入
%ls *list
这将列出当前目录中以list 结尾的所有文件
https://www.ruanyifeng.com/blog/2018/09/bash-wildcards.html
更多内容可以看这个,不过理解了*和?基本上足以应对大部分情况了
关于正则匹配,则有更多的话要讲
正则匹配的详细介绍与实际应用
正则表达式(Regular Expression,简称regex)是一种强大的文本匹配工具,广泛应用于字符串搜索、替换、验证等场景。在编译原理中,正则表达式用于词法分析阶段,帮助识别源代码中的基本语法单元(如标识符、关键字、运算符等)。
正则表达式的详细规则
1. 基本元字符
.:匹配任意单个字符(除换行符外)。\\d:匹配数字(等价于[0-9])。\\D:匹配非数字字符。\\w:匹配字母、数字或下划线(等价于[a-zA-Z0-9_])。\\W:匹配非字母、数字或下划线的字符。\\s:匹配空白字符(空格、制表符、换行符等)。\\S:匹配非空白字符。
2. 量词
*:匹配前一个字符零次或多次。+:匹配前一个字符一次或多次。?:匹配前一个字符零次或一次。{n}:匹配前一个字符恰好n次。{n,}:匹配前一个字符至少n次。{n,m}:匹配前一个字符至少n次,至多m次。
3. 字符类
[abc]:匹配括号内的任意一个字符(a、b或c)。[^abc]:匹配不在括号内的任意一个字符。[a-z]:匹配a到z之间的任意一个小写字母。
4. 边界匹配
^:匹配字符串的开头。$:匹配字符串的结尾。\\b:匹配单词边界。\\B:匹配非单词边界。
5. 分组与捕获
(abc):捕获组,匹配并记住匹配的文本。(?:abc):非捕获组,匹配但不记住匹配的文本。|:或操作,匹配左边或右边的表达式。
6. 转义字符
\\:用于转义特殊字符(如\\.匹配句点,\\*匹配星号)。
正则表达式的实际应用
1. 文本搜索与替换
正则表达式常用于文本编辑器或编程语言中,进行字符串的搜索和替换。
示例 :
搜索所有电子邮件地址:
[\\w\\.-]+@[\\w\\.-]+\\.\\w+替换文本中的日期格式:将
dd/mm/yyyy替换为yyyy-mm-dd。
2. 数据验证
正则表达式可用于验证用户输入的数据格式。
示例 :
验证电子邮件地址:
^[\\w\\.-]+@[\\w\\.-]+\\.\\w+$验证手机号码:
^\\d{10}$
3. 编译原理中的词法分析
在编译器中,正则表达式用于定义词法规则,识别源代码中的基本语法单元(Token)。
示例 :
识别标识符:
[a-zA-Z_]\\w*识别整数:
\\d+识别浮点数:
\\d+\\.\\d+
在编译原理中的应用
在编译器的词法分析阶段,正则表达式用于定义词法规则。词法分析器(Lexer)根据这些规则将源代码分解为一个个Token。
示例 :
假设我们需要识别以下Token:
关键字:
if、else标识符:以字母或下划线开头,后跟字母、数字或下划线。
整数:由数字组成。
运算符:
+、-、*、/
对应的正则表达式规则:
关键字:
if|else标识符:
[a-zA-Z_]\\w*整数:
\\d+运算符:
[\\+\\-\\*/]
使用代码表述正则匹配的作用
以下是使用Python代码演示正则表达式的应用:
1. 匹配电子邮件地址
import re
定义正则表达式
email_pattern = r'[\w\.-]+@[\w\.-]+\.\w+'
测试字符串
text = "Contact us at support@example.com or info@domain.com."
查找所有匹配的电子邮件地址
emails = re.findall(email_pattern, text) print("Emails found:", emails)
2. 验证手机号码
import re
定义正则表达式
phone_pattern = r'^\d{10}$'
测试手机号码
phone_number = "1234567890"
验证手机号码
if re.match(phone_pattern, phone_number): print("Valid phone number.") else: print("Invalid phone number.")
3. 词法分析示例
import re
定义词法规则
token_specification = [
('NUMBER', r'\d+'), # 整数
('IDENTIFIER', r'[a-zA-Z_]\w*'), # 标识符
('OPERATOR', r'[\+\-\*/]'), # 运算符
('SKIP', r'[ \t
]'), # 跳过空白字符
]
编译正则表达式
token_regex = '|'.join(f'(?P<{pair[0]}>{pair[1]})' for pair in token_specification) lexer = re.compile(token_regex)
测试代码
code = "x = 10 + y * 20"
词法分析
for match in lexer.finditer(code): token_type = match.lastgroup token_value = match.group(token_type) if token_type != 'SKIP': print(f"Token: {token_type}, Value: {token_value}")
输出 :
Token: IDENTIFIER, Value: x
Token: OPERATOR, Value: = Token: NUMBER, Value: 10 Token: OPERATOR, Value: + Token: IDENTIFIER, Value: y Token: OPERATOR, Value: * Token: NUMBER, Value: 20
总结
正则表达式是一种强大的工具,适用于文本处理、数据验证和编译原理中的词法分析。通过掌握其规则和应用场景,可以高效地解决复杂的字符串匹配问题。