通配符与正则匹配
首先直接介绍两个名词的直接含义
Contents
通配符
一般指在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\n]'), # 跳过空白字符
]
# 编译正则表达式
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
总结
正则表达式是一种强大的工具,适用于文本处理、数据验证和编译原理中的词法分析。通过掌握其规则和应用场景,可以高效地解决复杂的字符串匹配问题。
[…] 通配符与正则匹配 […]