matlab 正则表达式
正则表达式是一个通用的文本匹配模式,它可以用来描述文本中的字符模式。在matlab中,正则表达式提供了强大的文本匹配功能,可以用来从文本中提取有用的信息。本文将讲解matlab的正则表达式相关知识。
正则表达式的语法
下面是一些最基本的正则表达式元字符和操作符:
.
表示任意单个字符*
表示匹配任意数量的前一个字符?
表示匹配零个或一个前一个字符+
表示匹配一个或多个前一个字符[]
表示匹配一组字符中的任意一个[^]
表示匹配除了一组字符中的任意一个以外的其它字符|
表示匹配两个或多个可选的字符()
圆括号用于分组匹配
举个例子,下面是一个比较常见的正则表达式,用来匹配邮箱地址:
emailPattern = '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';
这个正则表达式的含义是:
^
表示匹配字符串的开始位置[a-zA-Z0-9._%+-]+
表示匹配一或多个字母、数字、下划线、点、百分号、加号、减号@
表示匹配一个@[a-zA-Z0-9.-]+
表示匹配一个或多个字母、数字、点、减号\.
表示匹配一个点[a-zA-Z]{2,}
表示匹配至少两个字母
而且,正则表达式中的每个原子都有一个默认量词,即:
.
默认数量是1*
默认数量是0到无限多+
默认数量是1到无限多?
默认数量是0或1
例如,abc+
表示匹配至少有一个c的abc。如果想要匹配至少两个c,需要写成ab(cc)+
。
matlab 正则表达式函数
在matlab中,有很多函数可以用来进行正则表达式操作,例如regexp
、regexprep
、regexpi
等。下面是一些常用的正则表达式函数:
regexp
函数用于匹配字符串中的正则表达式,并返回匹配部分的起始位置、结束位置和字符串本身。
str = "hello world";
expression = "world";
startIndex = regexp(str,expression);
matchStr = str(startIndex:end);
这里我们给了一个字符串和一个正则表达式,程序会找到字符串中符合正则表达式的部分,并返回其起始位置和结束位置。这里返回的结果为 startIndex = 7
,表明匹配的部分从字符串的位置7(即字母“w”)开始,一直到字符串的最后,为“world”。
regexpi
函数和regexp
类似,但是它不区分大小写。因此,当你想要在一个字符串中查找类似“Hello”、“HELLO”、“hEllo”之类的内容时,你可以使用这个函数。
str = "Hello World";
expression = "world";
startIndex = regexpi(str,expression);
matchStr = str(startIndex:end);
这里我们使用了regexpi
函数,并传入了一个字符串和一个正则表达式模式。由于正则表达式里的字符全是小写的,而输入字符串里是一个大写字母,所以这样匹配是不会成功的。但是由于我们在函数中使用了regexpi
函数,这个函数会忽略大小写,所以匹配成功了。这里返回的结果同样为startIndex = 7
,匹配的部分也是从“w”开始的。
regexprep
函数用于在字符串中替换正则表达式匹配的内容。
str = "A1B2C3D4";
pattern = '([A-Z])';
replace = '{lower(1)}';
newStr = regexprep(str,pattern,replace);
这里我们传入了一串字符串和一个正则表达式模式,我们希望在此字符串中找到所有的大写字母并将它们转换为小写字母。我们使用的替换表达式${lower($1)}
表示将匹配的内容转换为小写字母。这里的$1
表示匹配到的大写字母。
regexpi
函数和regexp
类似,但是它不区分大小写。因此,当你想要在一个字符串中查找类似“Hello”、“HELLO”、“hEllo”之类的内容时,你可以使用这个函数。
str = "Hello World";
expression = "world";
startIndex = regexpi(str,expression);
matchStr = str(startIndex:end);
这里我们使用了regexpi
函数,并传入了一个字符串和一个正则表达式模式。由于正则表达式里的字符全是小写的,而输入字符串里是一个大写字母,所以这样匹配是不会成功的。但是由于我们在函数中使用了regexpi
函数,这个函数会忽略大小写,所以匹配成功了。这里返回的结果同样为startIndex = 7
,匹配的部分也是从“w”开始的。
正则表达式的一些技巧
- 转义字符:将特殊字符转为普通字符
有时候,正则表达式需要匹配的内容包含一些特殊字符,这些字符在正则表达式中有特殊的含义,例如+
表示一次或多次,*
表示零次或多次。所以,如果我们需要匹配这些实际含义上的字符,需要在它们前面加上转义字符\
。
pattern = '3.14\+';
str = '3.1459';
idx = regexp(str,pattern);
这里我们定义一个字符串模式 3.14\+
,它会匹配到以3.14开头的加号,因为加号在正则表达式中代表一次或多次,所以我们需要在它前面加上转义字符\
。当我们使用regexp
函数匹配时,它会返回第一个匹配项的起始位置。
- 贪婪量词和非贪婪量词
我们之前提到过量词的默认方式,但是实际中,量词还可以设置为非贪婪模式,这样可以匹配尽可能少的字符。只需在量词后面加上?
即可。
str = "1234567890";
pattern = "\d{3,5}?";
startIndex = regexp(str,pattern);
matchStr = str(startIndex:end);
这里我们定义了一个正则表达式模式,用来匹配3-5个数字的集合。但是随着匹配数量的增加,可能会匹配到不符合条件的数字。这时候可以在后面加上?
进行非贪婪匹配。这样我们匹配的内容就是最少的3个数字了。
- 利用字符集
正则表达式还提供了字符集的概念,即用方括号[]
来匹配一组字符中的任何一个。例如,我们可以使用字符集来匹配一组字母。
str = "hello world";
pattern = "[aeiou]";
vowels = regexp(str,pattern);
这里我们定义了一个字符集[aeiou]
,它表示匹配其中任意一个字母(大小写不敏感)。当我们使用regexp
函数匹配时,它会返回匹配到的所有起始位置。这里返回的结果为vowels = 2,4,7,9
,这是因为我们匹配到了字符‘e’、‘o’、‘o’、‘o’,它们分别出现在字符串的第2、4、7、9个位置。
- 利用分组
在正则表达式中,我们还可以用圆括号来建立分组,从而更灵活地匹配需要的部分。
str = "I like apple pie";
pattern = "(apple).*(pie)";
matchStr = regexp(str,pattern,'match');
这里我们定义了一个正则表达式模式,使用了两个圆括号分组。第一个分组用来匹配包含‘apple’的内容,第二个分组用来匹配包含‘pie’的内容。当我们使用regexp
函数匹配时,它会返回完整的匹配结果(包括两个分组),我们可以使用参数'match'
来仅返回匹配到的部分。这里返回的结果为matchStr = "apple pie"
。
结论
本文介绍了matlab中的正则表达式相关知识,包括正则表达式的语法和常用函数等。通过这些内容的学习,读者可以更加灵活地运用正则表达式来处理字符串。