MATLAB 正则表达式完全教程


发布日期 : 2022-12-30 03:41:26 UTC

访问量: 10 次浏览

MATLAB 正则表达式

MATLAB中的正则表达式是用来匹配和处理文本的工具。它可以帮助你快速地搜索和处理文本内容。

在MATLAB中,你可以使用正则表达式来做很多事情,例如:

– 匹配某个字符串

– 搜索/替换某个字符串

– 从文本中提取信息

正则表达式基础

正则表达式是一个特殊的字符序列,可以用于匹配字符串。以下是一些基础正则表达式符号和它们的含义:

符号含义
.*匹配任何字符,零个或多个
[ ]匹配方括号中任意一个字符
[^ ]不匹配方括号中的字符
\d匹配数字
\D不匹配数字
\w匹配单词字符(字母、数字和下划线)
\W不匹配单词字符

下面是一个匹配数字的例子:

str = 'hello123world';
regexp(str, '\d')

输出:

2

这里的正则表达式 \d 匹配字符串 str 中的数字字符。因为数字字符出现在字符串的第二个位置,所以输出 2。

另一个例子是匹配以字母“a”开头的单词:

str = 'aardvark is a nice animal';
regexp(str, '\ba\w*')

输出:

1

这里的正则表达式 \ba\w* 匹配以字母“a”开头的单词。 \b 表示单词边界, \w 匹配单词字符, * 表示零个或多个。

正则表达式函数

在 MATLAB 中,有一些正则表达式的函数可以用来执行各种操作。下面是一些重要的函数:

函数含义
regexp()用于在字符串中查找符合正则表达式的子串
regexprep()用于替换字符串中符合正则表达式的子串
regexpi()与 regexp() 函数类似,但不区分大小写
regexprep()与 regexprep() 函数类似,但不区分大小写

以下是一些使用上述函数的例子:

匹配字符串中的数字:

str = 'hello123world';
match = regexp(str, '\d', 'match')

输出:

'1' '2' '3'

这里的 regexp() 函数返回了所有匹配到的数字。 'match' 参数告诉函数返回与正则表达式匹配的字符串子串。

提取出字符串中所有的单词:

str = 'The quick brown fox jumps over the lazy dog';
match = regexp(str, '\w*', 'match')

输出:

'The' '' 'quick' '' 'brown' '' 'fox' '' 'jumps' '' 'over' '' 'the' '' 'lazy' '' 'dog' ''

以上代码返回了字符串中的所有单词。 \w* 匹配任意长度的单词,包括空字符串。

将字符串中所有的数字替换为一个占位符:

str = 'hello123world';
newstr = regexprep(str, '\d', '###')

输出:

'hello###world'

这里的 regexprep() 函数将字符串中所有的数字替换为 ###

结合 MATLAB 函数使用正则表达式

除了上述讨论的正则表达式函数,MATLAB 还有很多其他有用的字符串处理函数。在实际应用中,你可以使用这些函数与正则表达式函数结合使用来完成各种任务。以下是一些示例:

例子1: 从 URL 中提取域名

url = 'https://www.baidu.com/';
pattern = '(?<protocol>http[s]?)://(?<domain>[^/]+)';
match = regexp(url, pattern, 'names');
domain = match.domain

输出:

'dwww.baidu.com'

这里的正则表达式
(?<protocol>http[s]?)://(?<domain>[^/]+)
匹配 URL 中的协议和域名。
(?<protocol>http[s]?)
子表达式匹配
http

https
协议,
(?<domain>[^/]+)
子表达式匹配域名。
'names'
参数告诉
regexp()
函数返回分组命名的捕获结果,便于后续处理。最后从捕获结果中提取
domain

例子2: 从日志文件中提取出错信息

假设你有一个日志文件(
log.txt
),其中包含了很多条日志信息。你想要从中提取出错信息以便进一步分析。

以下是一段示例日志信息:

[2021-10-21 15:31:44] [ERROR] File not found: ./data.txt.
[2021-10-22 09:15:23] [INFO] Starting server on port 8080.
filename = 'log.txt';
filecontent = fileread(filename);
pattern = '\[([^\]]+)\]\s+\[(ERROR)\]\s+(.*)';
matches = regexp(filecontent, pattern, 'tokens');
errors = {};
for i = 1:length(matches)
if ~isempty(matches{i})
timestamp = matches{i}{1};
message = matches{i}{3};
errors{end+1} = struct('timestamp', timestamp, 'message', message);
end
end

输出:

errors =
1×1 struct array with fields:
timestamp
message

这个示例中,我们首先使用
fileread()
函数读取
log.txt
文件的内容。然后,我们使用正则表达式
\[[^\]]+\]\s+\[(ERROR)\]\s+(.*)
匹配每一条日志信息,提取其中的时间戳和错误消息,并将它们保存到一个结构体中。使用
isempty()
函数检查是否有匹配到的错误信息,如果有就将其加到错误数组中。最终结果是一个结构体数组,每个结构体包括时间戳和错误消息。

结论

正则表达式是 MATLAB 中极为重要的工具,能够帮助你快速处理文本和字符串。熟练掌握正则表达式语法,并结合 MATLAB 中的各种字符串处理函数,可以让你的编程效率大幅提升。