首页 > 解决方案 > Matlab:正则表达式:除了:需要点“。” 最终功能

问题描述

为什么以下正则表达式查找所有实例 EXCEPTabd需要在给定模式的末尾添加一个点才能按预期运行:

>> regexp({'abc';'abd'},'^(?!abd$)')
ans =
{
  [1,1] = [](1x0)
  [2,1] = [](1x0)
}

>> regexp({'abc';'abd'},'^(?!abd$).')
ans =
{
  [1,1] = 1
  [2,1] = [](1x0)
}

这也适用于不使用单元格的更简单的情况:

>> regexp('abc','^(?!abd$)')
ans = [](1x0)

>> regexp('abc','^(?!abd$).')
ans = 1

标签: regexmatlab

解决方案


在您检查regexp参考页面并看到默认情况下不返回空匹配项后,这一点就很清楚了。

请注意,^(?!abd$)模式是两个非消耗模式的序列,一个字符串锚点的开头 ( ^) 和一个与字符串中的位置匹配的负前瞻 ( (?!abd$)),该位置不紧跟abd字符串的结尾和字符串的结尾。

当您.在前瞻之后添加 a 时,您将消耗部分引入正则表达式,现在它实际上匹配并消耗任何单个字符,然后正则表达式返回非空匹配。

您只需要通过添加emptymatch选项来覆盖默认行为:

>> regexp({'abc';'abd'},'^(?!abd$)', 'emptymatch'
)
ans =
{
  [1,1] =  1
  [2,1] = [](1x0)
}

推荐阅读