pattern
说明
模式定义使用文本搜索函数(如 contains
、matches
和 extract
)匹配文本的规则。您可以使用模式函数、运算符和字面文本来构建模式表达式。例如,MATLAB® 版本名称,以 "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
。搜索规则 - 模式必须出现多少次、区分大小写、可选模式和命名表达式,如
asManyOfPattern
和optionalPattern
。边界 - 特定字符序列开头或结尾处的边界,如
alphanumericBoundary
。边界模式可以使用~
运算符来求反,这样与边界的匹配会阻止其模式表达式的匹配。模式组织 - 定义模式结构并指定模式表达式的显示方式,如
maskedPattern
和namedPattern
。
函数 pattern
还使用语法 pat = pattern(txt)
创建模式函数,其中 txt
是 pat
匹配的字面文本。模式函数对于指定函数参量验证的模式类型很有用。但是,在其他情况下很少需要 pattern
函数,因为 MATLAB 文本匹配函数接受文本输入。
对象函数
搜索文本
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 | 指定命名模式 |
示例
使用模式搜索文本
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
来代替模式表达式。
mathSymbols = maskedPattern(mathSymbols); shortExpressionPat = asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
shortExpressionPat = pattern
Matching:
asManyOfPattern(mathSymbols + whitespacePattern) + mathSymbols
Use details to show more information
创建一个包含一些算术表达式的字符串,然后从文本中提取模式。
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 开头和结尾的单词。
dWordsPat = letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary; rWordsPat = letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary;
使用命名模式构建一个模式,该模式查找以 D 开头和结尾的单词后跟以 R 开头和结尾的单词。
dAndRWordsPat = dWordsPat + whitespacePattern + rWordsPat
dAndRWordsPat = pattern
Matching:
letterBoundary + caseInsensitivePattern("d" + lettersPattern + "d") + letterBoundary + whitespacePattern + letterBoundary + caseInsensitivePattern("r" + lettersPattern + "r") + letterBoundary
此模式难以阅读,也不能充分表示其目的。使用 namedPattern
将模式指定为显示指定名称和说明的命名模式以代替模式表达式。
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
Use details to show more information
创建一个字符串并提取与模式匹配的文本。
txt = "Dad, look at the divided river!";
words = extract(txt,dAndRWordsPat)
words = "divided river"
匹配电子邮件地址
构建易于阅读的模式来匹配电子邮件地址。
电子邮件地址遵循结构 username@domain.TLD,其中 username 和 domain 由用句点分隔的标识符组成。构建一个模式,它匹配由字母数字字符和 "_"
字符的任意组合组成的标识符。使用 maskedPattern
将此模式命名为 identifier
。
identifier = asManyOfPattern(alphanumericsPattern(1) | "_", 1);
identifier = maskedPattern(identifier);
构建模式以匹配由标识符组成的域和子域。创建一个匹配指定列表中的 TLD 的模式。
subdomain = asManyOfPattern(identifier + ".") + identifier; domainName = namedPattern(identifier,"domainName"); tld = "com" | "org" | "gov" | "net" | "edu";
构建一个模式来匹配电子邮件的本地部分,它匹配一个或多个用句点分隔的标识符。通过组合先前定义的各模式构建一个模式,用于匹配域、TLD 和任何可能存在的子域。使用 namedPattern
将其中每个模式分配给一个命名模式。
username = asManyOfPattern(identifier + ".") + identifier; domain = optionalPattern(namedPattern(subdomain) + ".") + ... domainName + "." + ... namedPattern(tld);
将所有模式组合成一个模式表达式。使用 namedPattern
将 username
、domain
和 emailPattern
分配给命名模式。
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"
Use details to show more information
创建一个包含电子邮件地址的字符串,然后从文本中提取模式。
txt = "You can reach me by email at John.Smith@department.organization.org";
extract(txt,emailPattern)
ans = "John.Smith@department.organization.org"
命名模式允许使用点索引以便访问命名子模式。使用点索引将特定值赋给命名模式 domain
。
emailPattern.emailAddress.domain = "mathworks.com"
emailPattern = pattern
Matching emailAddress:
username + "@" + domain
Using named patterns:
emailAddress: username + "@" + domain
username : asManyOfPattern(identifier + ".") + identifier
domain : "mathworks.com"
Use details to show more information
扩展功能
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
版本历史记录
在 R2020b 中推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)