我在某些文本文件中有多行,例如
.model sdata1 s tstonefile='../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p' passive=2
我想在MATLAB中的单引号之间提取文本。
很多人会感激不尽。
答案 0 :(得分:2)
如果您打算使用textscan:
fid = fopen('data.txt','r');
rawdata = textscan(fid,'%s','delimiter','''');
fclose(fid);
output = rawdata{:}(2)
正如在其他答案中使用的那样,单撇号'
由双倍撇号表示:''
,例如用于分隔符。
考虑评论:
fid = fopen('data.txt','r');
rawdata = textscan(fid,'%s','delimiter','\n');
fclose(fid);
lines = rawdata{1,1};
L = size(lines,1);
output = cell(L,1);
for ii=1:L
temp = textscan(lines{ii},'%s','delimiter','''');
output{ii,1} = temp{:}(2);
end
答案 1 :(得分:2)
要获取多个''
块内的所有文本,可以按如下方式使用regexp:
regexp(txt,'''(.[^'']*)''','tokens')
这表示文本被'
字符包围,但在捕获的文本中不包含'
。例如,考虑这个文件有两行(我编写了不同的文件名),
txt = ['.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'' passive=2 ', char(10), ...
'.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_3port_via_minstub.s00p'' passive=2']
>> stringCell = regexp(txt,'''(.[^'']*)''','tokens');
>> stringCell{:}
ans =
'../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'
ans =
'../data/s_element/isdimm_rcv_via_3port_via_minstub.s00p'
>>
花絮:
char(10)
给出换行符,因为10是换行符的ASCII码。.
中的regexp
字符(编码字的其余部分中的regex
)模式通常与换行符不匹配,这会使其成为更安全的模式。 In MATLAB, a dot in regexp
does match a newline,所以要禁用它,我们可以添加'dotexceptnewline'
作为`regexp``的最后一个输入参数。这样可以方便地确保我们不会在引号的外部中找到它,但是由于第一个匹配设置了先例,因此不需要。'
匹配中排除[^'']
,而是可以使用?
非贪婪地进行匹配,如下所示regexp(txt,'''(.*?)''','tokens')
。答案 2 :(得分:2)
一种简单的方法是使用单引号分隔符拆分字符串,并在输出中使用偶数编号的字符串:
str = fileread('test.txt');
out = regexp(str, '''', 'split');
out = out(2:2:end);
答案 3 :(得分:1)
您可以使用正则表达式执行此操作。假设引号之间只出现一次文本:
% select all chars between single quotation marks.
out = regexp(inputString,'''(.*)''','tokens','once');
答案 4 :(得分:1)
在确定要从中提取信息的行后,如果它们都具有相同的格式,您可以对其进行标记或执行类似的操作:
test='.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'' passive=2';
a=strfind(test,'''')
test=test(a(1):a(2))