摘 要:正则表达式是一个重要的编程概念。应用正则表达式可以实现很多强大的字符处理功能,有时也可以为常规方法解决起来比较复杂的问题另辟蹊径。本文试图通过比较详尽的示例为没有基础的读者介绍正则表达式的基本概念、用法及其在Matlab中的实现。文末附上几个应用表达式解决实际问题的实例,以利于读者在自己的实践中应用。
关 键 词:正则表达式 Matlab regexp
1. 引言
正则表达式就是一个表达式(也是一串字符),它定义了某种字符串模式——利用正则表达式,可以
对大段的文字进行复杂的查找、替换等。本文将以 Matlab 为编程语言,讲解正则表达式的概念和使用方法,
并将在文末以实例说明正则表达式的实践应用。
Matlab 提供的正则表达式函数有三个:
regexp——用于对字符串进行查找,大小写敏感;
regexpi——用于对字符串进行查找,大小写不敏感;
regexprep——用于对字符串进行查找并替换。
简要介绍一下这三个函数,以 regexpi 为例 —— 读者可以先跳过这里,看过全文之后再来看这里。
用法 1:
[start end extents match tokens names] = regexpi('str', 'expr')
start 为匹配字符串的起始位置;end 为匹配字符串的终止位置;extents 为扩展内容,和'tokens'指示符
一起用,指示出现 tokens 的位置;match 即找到的匹配字串;tokens 匹配正则表达式中标记(tokens)的字串;
names 为匹配到的命名标记的标记名。
用法 2:
若不需要所有的输出,可以用下面的方式有选择的输出。
[v1 v2 ...] = regexpi('str', 'expr', 'q1', 'q2', ...)
'q1'、'q2' ...... 为 'start'、'end'、'tokens'、'tokensExtents'、'match'、'names' 之一,意义与前文相同。v1、
v2...... 的输出顺序与 q1、q2...... 一致。
2. 单个字符的匹配
我们先从简单的开始 —— 以 regexpi 函数为例,不区分字符的大小写。假设你要搜索 'cat',搜索用
的正则表达式就是 'cat',这与文本编辑工具里常用的 CTRL+F 是一样的,即正则表达式 'cat' 匹配 'cat'、
'Cat'、'cAt'、'CAt'、'caT'、'CaT'、'cAT'、'CAT'。
为了方便,下面的叙述中字符串和正则表达式的''都省略不写。
2.1 句点符号
. —— 匹配任意一个(只有一个)字符(包括空格)。
假设你在玩英文拼字游戏,想要找出三个字母的单词,而且这些单词必须以 't' 字母开头,以 'n' 字母结束;另外,有一本英文字典,你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式,你可以使用一个通配符 —— 句点符号 '.' 。这样,完整的表达式就是 t.n,它匹配 tan、ten、tin 和 ton,还匹配 t#n、tpn 甚至 t n,还有其他许多无意义的组合。这是因为句点符号匹配所有字符,包括空格,即:正则表达式 t.n 匹配 ten、tin、ton、t n、tpn、t#n、t@n 等。
Matlab 程序实例:
clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,
t#n,4@).,t@nT&nY';
pat='t.n';
o1=regexpi(str,pat,'start') %用'start'指定输出 o1 为匹配正则表达式的子串的起始位置
o2=regexpi(str,pat,'end') %用'end'指定输出 o2 为匹配正则表达式的子串的结束位置
o3=regexpi(str,pat,'match') %用'match'指定输出 o3 为匹配正则表达式的子串
[o11,o22,o33]=regexpi(str,pat,'start','end','match') %同时输出起始位置和字串
输出为:
o1 = 1 10 18 23 31 39 48 51
o2 = 3 12 20 25 33 41 50 53
o3 = 'ten' 'tin' 'ton' 't n' 'tpn' 't#n' 't@n' 'T&n'
o11 = 1 10 18 23 31 39 48 51
o22 = 3 12 20 25 33 41 50 53
o33 = 'ten' 'tin' 'ton' 't n' 'tpn' 't#n' 't@n' 'T&n'
2.2 方括号符号
[oum] —— 匹配方括号中的任意一个。
为了解决句点符号匹配范围过于广泛这一问题,你可以在方括号([])里面指定看来有意义的字符。此时,只有方括号里面指定的字符才参与匹配。也就是说,正则表达式 t[aeio]n 只匹配 tan、Ten、tin 和 toN等。但 Tmn、taen 不匹配,因为在方括号之内你只能匹配单个字符。
Matlab 程序实例:
clear;clc
str='ten,&8yn2tin6ui>&ton, t n,-356tpn,
t#n,4@).,t@nT&nY';
pat='t[aeiou]n';
[o11,o22,o33]=regexpi(