Matlab中正则表达式中的前向断言

目录

正则表达式中的前向断言

前向断言

重叠匹配项

逻辑 AND 条件


正则表达式中的前向断言

前向断言

        正则表达式有两种类型的环顾断言:前向断言和后向断言。在这两种情况下,断言是一个必须满足才能返回表达式匹配项的条件。

        前向断言的形式为 (?=test),可以显示在正则表达式中的任意位置。MATLAB® 从文本的当前位置向前查找测试条件。如果 MATLAB 与测试条件匹配,它将会继续处理表达式的其余部分以找到匹配项。

        例如,在指定路径的字符向量中向前查找以找到包含程序文件(此示例中为 fileread.m)的文件夹的名称。

chr = which('fileread')
chr =

    'matlabroot\toolbox\matlab\iofun\fileread.m'
regexp(chr,'\w+(?=\\\w+\.[mp])','match')
ans =

  1×1 cell array

    {'iofun'}

        匹配表达式 \w+ 会搜索一个或多个字母数字或下划线字符。每次 regexp 找到与此条件匹配的项时,它都会向前查找反斜杠(通过两个反斜杠 \\ 指定),后跟一个带有 .m 或 .p 扩展名 (\.[mp]) 的文件名 (\w+)。regexp 函数返回符合前向条件的匹配项,即文件夹名称 iofun。

重叠匹配项

        前向断言不消减文本中的任何字符。因此,可以使用它们来查找重叠的字符序列。

        例如,使用前向搜索并通过匹配后跟五个其他字符的初始字符,在字符向量中查找每一个由六个非空白字符组成的序列:

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S(?=\S{5})')
startIndex =

     1     8     9    16    17    24    25

        起始索引与以下短语对应:

Locate   severa   everal   6-char   -char.   phrase   hrases

        如果没有前向运算符,MATLAB 将从左至右解析字符向量,并在解析过程中消减该向量。如果找到匹配的字符,regexp 将会记录相应位置并从最新匹配项的位置开始继续解析字符向量。此过程不存在字符重叠。

chr = 'Locate several 6-char. phrases';
startIndex = regexpi(chr,'\S{6}')
startIndex =

     1     8    16    24

        起始索引与以下短语对应:

Locate   severa   6-char   phrase

逻辑 AND 条件

        使用前向运算的另一种方式是在两个条件之间执行逻辑 AND。此示例最初会尝试找到字符数组(由normest函数帮助的前 50 个字符组成)中的所有小写辅音字母。

helptext = help('normest');
chr = helptext(1:50)
chr =

    ' NORMEST Estimate the matrix 2-norm.
         NORMEST(S'

        仅仅搜索非元音字母 ([^aeiou]) 不会返回预期的答案,因为输出包含大写字母、空格字符和标点符号:

c = regexp(chr,'[^aeiou]','match')
c =

  1×43 cell array

  Columns 1 through 14

    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {' '}    {'E'}    {'s'}    {'t'}    {'m'}    {'t'}

  Columns 15 through 28

    {' '}    {'t'}    {'h'}    {' '}    {'m'}    {'t'}    {'r'}    {'x'}    {' '}    {'2'}    {'-'}    {'n'}    {'r'}    {'m'}

  Columns 29 through 42

    {'.'}    {'↵'}    {' '}    {' '}    {' '}    {' '}    {'N'}    {'O'}    {'R'}    {'M'}    {'E'}    {'S'}    {'T'}    {'('}

  Column 43

    {'S'}

        重新尝试此操作,并使用前向运算符创建以下 AND 条件:

(lowercase letter) AND (not a vowel)

        这一次的结果是正确的:

c = regexp(chr,'(?=[a-z])[^aeiou]','match')
c =

  1×13 cell array

    {'s'}    {'t'}    {'m'}    {'t'}    {'t'}    {'h'}    {'m'}    {'t'}    {'r'}    {'x'}    {'n'}    {'r'}    {'m'}

        请注意,使用前向运算符执行AND时,需要将匹配表达式expr放在测试表达式test的后面:

(?=test)expr or (?!test)expr

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB正则表达式可以通过内置的函数`regexp`和`regexprep`来使用。这些函数可以用于字符串匹配、查找和替换操作。 `regexp`函数可以用于查找和提取满足特定模式的子字符串。它的基本语法如下: ```matlab startIndex = regexp(str, expression) ``` 其,`str`是要搜索的字符串,`expression`是正则表达式模式。该函数返回一个包含匹配子字符串在`str`起始位置的起始索引的向量。 举个例子,假设我们要从字符串提取所有的数字,并返回它们在字符串的起始索引,可以使用如下代码: ```matlab str = 'I have 10 apples, and you have 20 oranges.'; startIndex = regexp(str, '\d+') ``` 这里的正则表达式模式`\d+`表示匹配一个或多个数字。 另一个常用的函数是`regexprep`,它可以用于根据正则表达式模式替换字符串的子字符串。它的基本语法如下: ```matlab newStr = regexprep(str, expression, replace) ``` 其,`str`是要进行替换的字符串,`expression`是正则表达式模式,`replace`是替换后的字符串。该函数返回一个替换后的新字符串。 举个例子,假设我们要将字符串的所有数字替换为字符串`NUM`,可以使用如下代码: ```matlab str = 'I have 10 apples, and you have 20 oranges.'; newStr = regexprep(str, '\d+', 'NUM') ``` 这里的正则表达式模式`\d+`表示匹配一个或多个数字,替换为字符串`NUM`。 以上是MATLAB正则表达式的基本使用方法,你可以根据具体的需求和正则表达式语法进行更复杂的匹配和替换操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值