我有一个看起来像这样的文本文件:
(a (bee (cold down)))
如果我使用
加载它c=textscan(fid,'%s');
我明白了:
'(a'
'(bee'
'(cold'
'down)))'
我想得到的是:
'('
'a'
'('
'bee'
'('
'cold'
'down'
')'
')'
')'
我知道我可以通过在文本扫描中指定'Delimiter'来分隔'('和')',但是我会松开这个角色,我想保留它。
先谢谢你。
答案 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