1

我有一个如下所示的文本文件:

(a (bee (cold down)))

如果我加载它使用

c=textscan(fid,'%s');

我明白了:

'(a'
'(bee'
'(cold'
'down)))'

我想得到的是:

'('
'a'
'('
'bee'
'('
'cold'
'down'
')'     
')'
')'

我知道我可以通过在 textscan 中指定 'Delimiter' 来用 '(' 和 ')' 分隔,但是我会丢失这个我想保留的字符。

先感谢您。

4

3 回答 3

1

AFAIK,没有罐装例程能够保留任意分隔符。你必须自己做:

string = '(a (bee (cold down)))';

bo = string == '(';
bc = string == ')';
sp = string == ' ';

output = cell(nnz(bo|bc|sp)+1,1);
j = 1;

for ii = 1:numel(string)
    if bo(ii) 
        output{j} = '(';
        j = j + 1;

    elseif bc(ii) 
        output{j} = ')';
        j = j + 1;

    elseif sp(ii) 
        j = j + 1;

    else
        output{j} = [output{j} string(ii)];

    end
end

这可能可以改进——不断增长的字符数组将阻止循环被 JIT 处理。该数组bc | bo | sp包含所有信息来矢量化这个东西,我只是不知道这个时候如何......

尽管如此,它应该给你一个开始的地方。

于 2012-08-16T20:24:07.213 回答
1

说明%s符表示您想要字符串,您想要的是单个字符。改用 %c.

c=textscan(fid,'%c');

如果您也想保持文字完整,请更新,然后您将需要使用说明符加载您的文本%s。加载文本后,您可以使用正则表达式(不是我的强项)解决此问题,也可以编写自己的解析器,然后单独解析每个单词并将括号和单词保存到新的单元格数组中。

于 2012-08-16T18:51:20.753 回答
0

Matlab有一个strtok类似C的函数,它的格式是:

token = strtok(str)
token = strtok(str, delimiter)
[token, remain] = strtok('str', ...)

还有一个字符串替换功能strrep

modifiedStr = strrep(origStr, oldSubstr, newSubstr)

我要做的是修改原始字符串strrep以添加分隔符,然后使用strtok. 由于您已经将字符串扫描到c

c = (c,'(','( '); %Add a space after each open paren
c = (c,')',' ) '); % Add a space before and after each close paren
token = zeros(10); preallocate for speed
i = 2;
[token(1), remain] = strtok(c, ' ');
while(remain)
    [token(i), remain] = strtok(c, ' ');
    i =i + 1;
end

为您提供您请求的每个字符串的线性标记数组。

strtok参考: http: //www.mathworks.com/help/techdoc/ref/strtok.html

strrep参考: http: //www.mathworks.com/help/techdoc/ref/strrep.html

于 2012-08-16T20:55:19.030 回答