原文连接:https://www.mathworks.com/help/releases/R2022b/matlab/ref/pattern.html?browser=F1help
能使用的搜索函数:
|----------------------------------------------------------------------------------------------------------------------|---------------|
| contains | 确定字符串中是否有模式 |
| matches | 确定模式是否与字符串匹配 |
| count | 计算字符串中模式的出现次数 |
| endsWith | 确定字符串是否以模式结尾 |
| startsWith | 确定字符串是否以模式开头 |
编辑文本函数:
|---------------------------------------------------------------------------------------------------------------------------------|----------------|
| extract | 从字符串中提取子字符串 |
| replace | 查找并替换一个或多个子字符串 |
| replaceBetween | 替换起点和终点之间的子字符串 |
| split | 在分隔符处拆分字符串 |
| erase | 删除字符串内的子字符串 |
| eraseBetween | 删除起点和终点之间的子字符串 |
| extractAfter | 提取指定位置后的子字符串 |
| extractBefore | 提取指定位置前的子字符串 |
| extractBetween | 提取起点和终点之间的子字符串 |
| insertAfter | 在指定的子字符串后插入字符串 |
| insertBefore | 在指定的子字符串前插入字符串 |
字符串匹配模式函数:
|------------------------------------------------------------------------------------------------------------------------------------|----------------|
| digitsPattern | 匹配数字字符 |
| lettersPattern | 匹配字母字符 |
| alphanumericsPattern | 匹配字母和数字字符 |
| characterListPattern | 匹配列表中的字符 |
| whitespacePattern | 匹配空白字符 |
| wildcardPattern | 匹配尽可能少的任意类型的字符 |
搜索规则模式:
|---------------------------------------------------------------------------------------------------------------------------------------------------|----------------|
| optionalPattern | 使模式匹配可选 |
| possessivePattern | 匹配模式而不回溯 |
| caseSensitivePattern | 以区分大小写的方式匹配模式 |
| caseInsensitivePattern | 以不区分大小写的方式匹配模式 |
| asFewOfPattern | 模式匹配次数尽可能少 |
| asManyOfPattern | 模式匹配次数尽可能多 |
边界模式的函数:
|---------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------|
| alphanumericBoundary | 匹配字母数字字符与非字母数字字符之间的边界 |
| digitBoundary | 匹配数字字符和非数字字符之间的边界 |
| letterBoundary | 匹配字母字符和非字母字符之间的边界 |
| whitespaceBoundary | 匹配空白字符和非空白字符之间的边界 |
| lineBoundary | 匹配行首或行尾 |
| textBoundary | 匹配文本的开头或结尾 |
| lookAheadBoundary | 匹配指定模式之前的边界 |
| lookBehindBoundary | 匹配指定模式之后的边界 |
正则表达式模式:
|------------------------------------------------------------------------------------------------------------------------------|--------------|
| regexpPattern | 匹配指定正则表达式的模式 |
模式组织函数:
|------------------------------------------------------------------------------------------------------------------------------|-------------|
| maskedPattern | 具有指定显示名称的模式 |
| namedPattern | 指定命名模式 |
1、以 "R"
开头,后跟四位数的年份,然后是 "a"
或 "b"
pat = "R" + digitsPattern(4) + ("a"|"b");
str = ["String was introduced in R2016b."
"Pattern was added in R2020b."];
extract(str,pat)
ans =
2x1 string array
"R2016b"
"R2020b"
示例
使用模式搜索文本
lettersPattern
是一个典型的、匹配字母字符的字符匹配模式。创建匹配一个或多个字母字符的模式。
txt = ["This" "is a" "1x6" "string" "array" "."];
pat = lettersPattern;
使用 contains
确定在每个字符串中是否存在与 pat
匹配的字符。输出逻辑数组显示 txt
中的前五个字符串包含字母,但第六个字符串不包含字母。
contains(txt,pat)
ans = 1x6 logical array
1 1 1 1 1 0
确定文本是否以指定的模式开头。输出逻辑数组显示 txt
中的四个字符串以字母开头,但有两个字符串不是。
startsWith(txt,pat)
ans = 1x6 logical array
1 1 0 1 1 0
确定字符串是否完全匹配指定的模式。输出逻辑数组显示 txt
中的哪些字符串只包含字母。
matches(txt,pat)
ans = 1x6 logical array
1 0 0 1 1 0
对模式匹配的次数进行计数。输出数值数组显示 txt
的每个元素中匹配 lettersPattern
的次数。请注意,lettersPattern
匹配一个或多个字母,因此一组连续匹配的字母被视为一次匹配。
count(txt,pat)
ans = 1×6
1 2 1 1 1 0
使用模式编辑文本
digitsPattern
是一个典型的、匹配数字字符的字符匹配模式。创建一个匹配数字字符的模式。
txt = ["1 fish" "2 fish" "[1,0,0] fish" "[0,0,1] fish"];
pat = digitsPattern;
使用 replace
编辑与模式匹配的文本片段。
replace(txt,pat,"#")
ans = 1x4 string
"# fish" "# fish" "[#,#,#] fish" "[#,#,#] fish"
通过在匹配的字母后插入 "!"
字符来创建新文本片段。
insertAfter(txt,pat,"!")
ans = 1x4 string
"1! fish" "2! fish" "[1!,0!,0!] fish" "[0!,0!,1!] fish"
可以使用 OR 运算符 |
与文本来创建模式。擦除与指定模式匹配的文本。
txt = erase(txt,"," | "]" | "[")
txt = 1x4 string
"1 fish" "2 fish" "100 fish" "001 fish"
从新文本中提取 pat
。
extract(txt,pat)
ans = 1x4 string
"1" "2" "100" "001"
对文本中的字符进行计数
使用模式对一段文本中出现的单个字符进行计数。
txt = "She sells sea shells by the sea shore.";
使用 alphanumericsPattern
将 pat
创建为与单个字母匹配的 pattern
对象。提取该模式。
pat = alphanumericsPattern(1);
letters = extract(txt,pat);
显示每个字母出现次数的直方图。
letters = lower(letters);
letters = categorical(letters);
histogram(letters)
显示复杂模式时隐藏细节
使用 maskedPattern
显示变量来代替复杂的模式表达式。
构建一个模式,该模式匹配由数字和算术运算符组成的简单算术表达式。
mathSymbols = asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)
mathSymbols = pattern
Matching:
asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)
使用 mathSymbols
构建一个模式,该模式匹配在字符之间具有空白的算术表达式。
longExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
longExpressionPat = pattern
Matching:
asManyOfPattern(asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1) + whitespacePattern) + asManyOfPattern(digitsPattern | characterListPattern("+-*/="),1)
显示的模式表达式很长且难以阅读。使用 maskedPattern
显示变量名称 mathSymbols
来代替模式表达式。
Matlab
mathSymbols = maskedPattern(mathSymbols);
shortExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
shortExpressionPat = pattern
Matching:
asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
Show all details
创建一个包含一些算术表达式的字符串,然后从文本中提取模式。
Matlab
txt = "What is the answer to 1 + 1? Oh, I know! 1 + 1 = 2!";
arithmetic = extract(txt,shortExpressionPat)
arithmetic = 2x1 string
"1 + 1"
"1 + 1 = 2"
为复杂模式指定名称和说明
基于两个命名模式创建一个模式。命名模式为模式的显示添加上下文。
构建两个模式:一个模式匹配以字母 D 开头和结尾的单词,另一个模式匹配以字母 R 开头和结尾的单词。
Matlab
dWordsPat = letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary;
rWordsPat = letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary;
使用命名模式构建一个模式,该模式查找以 D 开头和结尾的单词后跟以 R 开头和结尾的单词。
Matlab
dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
Matching:
letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary + whitespacePattern + letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary
此模式难以阅读,也不能充分表示其目的。使用 namedPattern
将模式指定为显示指定名称和说明的命名模式以代替模式表达式。
Matlab
dWordsPat = namedPattern(dWordsPat,"dWords", "Words that start and end with D");
rWordsPat = namedPattern(rWordsPat,"rWords", "Words that start and end with R");
dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
Matching:
dWords + whitespacePattern + rWords
Using named patterns:
dWords: Words that start and end with D
rWords: Words that start and end with R
Show more details
创建一个字符串并提取与模式匹配的文本。
Matlab
txt = "Dad, look at the divided river!";
words = extract(txt,dAndRWordsPat)
words =
"divided river"
匹配电子邮件地址
构建易于阅读的模式来匹配电子邮件地址。
电子邮件地址遵循结构 username@domain.TLD ,其中 username 和 domain 由用句点分隔的标识符组成。构建一个模式,它匹配由字母数字字符和 "_"
字符的任意组合组成的标识符。使用 maskedPattern
将此模式命名为 identifier
。
Matlab
identifier = asManyOfPattern(alphanumericsPattern(1) | "_", 1);
identifier = maskedPattern(identifier);
构建模式以匹配由标识符组成的域和子域。创建一个匹配指定列表中的 TLD 的模式。
Matlab
subdomain = asManyOfPattern(identifier + ".") + identifier;
domainName = namedPattern(identifier,"domainName");
tld = "com" | "org" | "gov" | "net" | "edu";
构建一个模式来匹配电子邮件的本地部分,它匹配一个或多个用句点分隔的标识符。通过组合先前定义的各模式构建一个模式,用于匹配域、TLD 和任何可能存在的子域。使用 namedPattern
将其中每个模式分配给一个命名模式。
Matlab
username = asManyOfPattern(identifier + ".") + identifier;
domain = optionalPattern(namedPattern(subdomain) + ".") + ...
domainName + "." + ...
namedPattern(tld);
将所有模式组合成一个模式表达式。使用 namedPattern
将 username
、domain
和 emailPattern
分配给命名模式。
Matlab
emailAddress = namedPattern(username) + "@" + namedPattern(domain);
emailPattern = namedPattern(emailAddress)
emailPattern = pattern
Matching emailAddress:
username + "@" + domain
Using named patterns:
emailAddress : username + "@" + domain
username : asManyOfPattern(identifier + ".") + identifier
domain : optionalPattern(subdomain + ".") + domainName + "." + tld
subdomain : asManyOfPattern(identifier + ".") + identifier
domainName: identifier
tld : "com" | "org" | "gov" | "net" | "edu"
Show all details
创建一个包含电子邮件地址的字符串,然后从文本中提取模式。
Matlab
txt = "You can reach me by email at John.Smith@department.organization.org";
extract(txt,emailPattern)
ans =
"John.Smith@department.organization.org"
命名模式允许使用点索引以便访问命名子模式。使用点索引将特定值赋给命名模式 domain
。
Matlab
emailPattern.emailAddress.domain = "mathworks.com"
emailPattern = pattern
Matching emailAddress:
username + "@" + domain
Using named patterns:
emailAddress: username + "@" + domain
username : asManyOfPattern(identifier + ".") + identifier
domain : "mathworks.com"
Show all details
处理变量名称问题:
endsWith(str,lettersPattern|digitsPattern|'_')
>> pattern = '(?<![\w])BBBB';
>> replacement = 'AAAA';
>> outputStr = regexprep('LOP_BBBB=BBBB+qw;', pattern, replacement)
替换变量前一个是非字母数字下划线组成的