另一种选择是使用正则表达式,利用您已经创建的字符串单元数组,但巧妙地根据您想要在单元数组中的每个字符串中搜索的指定输入模式来提取所需内容。在MATLAB中使用
regexp
函数来实现:
file= fopen('file.txt');
out = textscan(file,'%s','Delimiter','\n');
fclose(file);
out = regexp(out{1}, '/\w*/(.+)\s', 'tokens', 'once');
out = [out{:}].';
请注意,
textscan
将返回一个单元格数组的单个元素,因此在使用
regexp
之前需要通过访问第一个元素来解压缩单元格。 所提出的代码所做的是对于单元格数组中的每个字符串,它搜索相应的组合:
/
- 首先查找开始正斜杠
\w*/
- 然后查找字母或数字字符 - 在遇到另一个斜线之前至少有一个这些字符。 其好处在于您不仅限于第一个斜杠后的一个字符。 它们可以是任何字母数字字符。
(.+)
- 指定一个组,在第二个斜杠之后,我们收集空格之前的所有字符(见下一点)。 之所以要查找所有字符而不仅仅是字母数字,是因为可能还会出现更多的斜杠。 我们只有在遇到空格时才停止搜索(同样见下一点)。
\s
- 查找空格
它将搜索特定的字符集,实际上是在遇到空格之前的文本。 请注意,我必须在组(.+)
之后用空格进行分隔,否则它基本上会返回第二个斜杠后的整行文本。 您需要在那里使用它来限制字符串内的搜索。
第3点中的()
很重要,因为regexp
中的'tokens'
属性允许您另外提取位于组中的字符串。 使用'once'
仅提取第一个匹配项。 请注意,输出将是嵌套的单元格数组,其中每个单元格都是表示组内匹配的一个元素。 我们可以使用逗号分隔的列表解压缩单元格,并将它们全部连接到单个单元格数组中。 我们转置以保持您想要的列形矢量。
这样做后,我们得到以下结果:
>> out
out =
5×1 cell array
'apple'
'bat'
'cat'
'dog'
'human/female'
然而,我认为你更关心内容而不是数据形式,因此如果您愿意,可以删除转置。这种方法的好处在于无需使用cellfun
,因为regexp
会隐式循环。
{'';'a';'apple'.....}
我有多行以/a/开头,所以我无法使用索引跳过,因为没有模式。 - Likeunknown