我有一个表格,其中包含一个充满文件名字符串的列。 文件名有不同的格式:
str ={...
'filename',...
'filename_suffix',...
'filenamesuffix'};
我尝试使用regexp
提取每个文件名的后缀部分(并使用代码接收''
没有后缀的那个)(请注意,后缀可以是任何字符集,包括下划线):
regexp(str,'(?<=filename(_|)).*','match','emptymatch')
不幸的是,这给了我输出(在扩展输出单元之后):
ans =
{''}
ans =
'_suffix'
ans =
'suffix'
具体来说,它并没有像我在编写_
时所期望的那样忽略第二个后缀中的filename(_|)
,我理解为尝试匹配filename_
,如果没有发现尝试匹配filename
,但显然我误读了这一行。
任何人都可以帮助我使用2个选项中的任何一个来实现外观吗?
答案 0 :(得分:3)
首先,Matlab正则表达式,lookbehind不能在替代分支内部进行交替。
将模式展开为
regexp(str,'(?<=filename_|filename).*','match','emptymatch')
^^^^^^^^^^^^^^^^^^^^^^^
(?<=filename_|filename)
lookbehind将要求filename_
或filename
出现在除换行符之外的0 +字符之前(.*
)。 *但是,环视只检查文本而不消耗它。您允许filename
或filename_
在比赛前正确。因此,引擎一个接一个地检查左边的上下文,一旦它等于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中的每个单元格似乎只有一个文件名。如果您选择删除它,结果将是单元格数组的单元格数组。