通过char分隔但不删除它

时间:2012-08-16 18:44:09

标签: matlab

我有一个看起来像这样的文本文件:

(a (bee (cold down)))

如果我使用

加载它
c=textscan(fid,'%s');

我明白了:

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

我想得到的是:

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

我知道我可以通过在文本扫描中指定'Delimiter'来分隔'('和')',但是我会松开这个角色,我想保留它。

先谢谢你。

3 个答案:

答案 0 :(得分:1)

%s说明符表示你想要字符串,你想要的是个人字符。请改用%c

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

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

答案 1 :(得分: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包含所有用于向量化这个东西的信息,我只是看不出这个时候......

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

答案 2 :(得分:0)

Matlab具有类似于C的strtok函数。其格式为:

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