MATLAB中pattern函数用法

目录

说明

创建对象

示例

使用模式搜索文本

使用模式编辑文本

对文本中的字符进行计数

显示复杂模式时隐藏细节

为复杂模式指定名称和说明

匹配电子邮件地址


        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 文本匹配函数接受文本输入。

示例

使用模式搜索文本

        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

  Show all details

        创建一个包含一些算术表达式的字符串,然后从文本中提取模式。

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

  Show more details

        创建一个字符串并提取与模式匹配的文本。

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"

  Show all details

        创建一个包含电子邮件地址的字符串,然后从文本中提取模式。

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"

  Show all details

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值