在MATLAB中提取单引号之间的文本

时间:2013-10-17 16:18:48

标签: regex matlab quotes

我在某些文本文件中有多行,例如

.model sdata1 s tstonefile='../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p' passive=2

我想在MATLAB中的单引号之间提取文本。

很多人会感激不尽。

5 个答案:

答案 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))