通配符与正则匹配

2025年1月20日 作者 ScotI_Blog

首先直接介绍两个名词的直接含义

通配符

一般指在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:

  • 关键字:ifelse
  • 标识符:以字母或下划线开头,后跟字母、数字或下划线。
  • 整数:由数字组成。
  • 运算符:+-*/

对应的正则表达式规则:

  • 关键字: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

总结

正则表达式是一种强大的工具,适用于文本处理、数据验证和编译原理中的词法分析。通过掌握其规则和应用场景,可以高效地解决复杂的字符串匹配问题。

Print Friendly, PDF & Email