Matlab正则表达式;查看两个表达式中的任何一个

时间:2016-08-11 07:14:47

标签: regex matlab regex-lookarounds

我有一个表格,其中包含一个充满文件名字符串的列。 文件名有不同的格式:

str ={... 
'filename',...
'filename_suffix',...
'filenamesuffix'};

我尝试使用regexp提取每个文件名的后缀部分(并使用代码接收''没有后缀的那个)(请注意,后缀可以是任何字符集,包括下划线):

regexp(str,'(?<=filename(_|)).*','match','emptymatch')

不幸的是,这给了我输出(在扩展输出单元之后):

ans = 

{''}


ans = 

'_suffix'


ans = 

'suffix'

具体来说,它并没有像我在编写_时所期望的那样忽略第二个后缀中的filename(_|),我理解为尝试匹配filename_,如果没有发现尝试匹配filename ,但显然我误读了这一行。

任何人都可以帮助我使用2个选项中的任何一个来实现外观吗?

2 个答案:

答案 0 :(得分:3)

首先,Matlab正则表达式,lookbehind不能在替代分支内部进行交替。

将模式展开为

regexp(str,'(?<=filename_|filename).*','match','emptymatch')
            ^^^^^^^^^^^^^^^^^^^^^^^

(?<=filename_|filename) lookbehind将要求filename_filename出现在除换行符之外的0 +字符之前(.*)。 *但是,环视只检查文本而不消耗它。您允许filenamefilename_在比赛前正确。因此,引擎一个接一个地检查左边的上下文,一旦它等于filename,它就匹配其余的。

如果您只需要不带_的后缀,则可以使用以下解决方案之一:

ntoks = regexp(str, '(?<=filename_|filename)(?!_).*', 'match','emptymatch');

如果在当前位置之后有(?!_),那么将lookbehind与前瞻_结合使用会导致匹配失败(这意味着在filename__sometext的情况下不会匹配),或

ntoks = regexp(str, 'filename_?(.*)', 'tokens','emptymatch');

其中_可选?量词。

要获取捕获的部分,您需要使用'tokens',而不是'match'。请参阅Tokens in Regular Expressions

请参阅demo

答案 1 :(得分:3)

使用outkey tokens和捕获组可以实现另一种计算时间更短的方法:

str ={'filename','filename_suffix','filenamesuffix'};

result=regexp(str,'filename_?(.*)','tokens','emptymatch','once');

celldisp(result)

注意: 我添加了'once'选项,因为cellstring中的每个单元格似乎只有一个文件名。如果您选择删除它,结果将是单元格数组的单元格数组。