我要在matlab中替换文本文件中的特殊单词,但只是括号“[]”中的单词而不是所有单词。例如,我有这样的文字:
this is a [test]
I'm going to replace just test in [] not the other [test].
我要用测试1 替换单词 test 。结果应该是:
this is a [test1]
I'm going to replace just test in [] not the other [test1].
我需要推动并弹出支架吗?还是有简单的方法?
答案 0 :(得分:1)
我不是正则表达式的专家,所以我不能用一个表达式来做:
我将采用与 hbaderts 相同的表示法:
txt = 'I''m going to replace just test in [] not the other [test] but still [asdf test test asdf].';
word = 'test';
newWord = 'test1';
首先找到匹配的括号,然后通过arrayfun
将数据提取到单元格中,使用strrep
替换单词,然后再次连接单元格。
%%// Find all opening and matching closing brackets
[start,stop] = regexp(txt,'\[[^\]]*\]');
%%// Separate the data into cells:
foundBrackets = arrayfun(@(b,e) txt(b:e), start, stop, 'uni', 0);
beforefoundBrackets = arrayfun(@(b,e) txt(b:e), [1,stop(1:end-1)+1],start-1, 'uni', 0);
%%// Replace the data in the bracket cells:
replacedBrackets = strrep(foundBrackets, word, newWord);
newTxtinCells = [reshape([beforefoundBrackets;replacedBrackets],1,[]),txt(stop(end)+1:end)];
%%// Cat cells
newTxt = cat(2,newTxtinCells{:});
在这种情况下,单个正则表达式将执行:
newTxt = regexprep(txt,['\[([^\]]*)',word,'([^\]]*)\]'],['\[$1',newWord,'$2\]'])
答案 1 :(得分:0)
这需要正则表达式(regexp
)。我自己不是专家,但是让我告诉你一种方法(尽管可能有更优雅的解决方案):
使用regexp
在括号内查找test
的所有匹配项:
regexp(txt,['\[[^\]]*(',word,')[^\]]*\]']);
\[
以[[^\]]*
表示任何数量不是]
(
,)
仅用于分组word
正是您要找的。 li>
[^\]]*
,对于任何数量不是]
\]
以[] 您可以使用以下命令验证它是否找到了正确的事件(对于下面的示例)
regexp(txt,['\[[^\]]*(',word,')[^\]]*\]'],'match')
ans =
'[test]' '[asdf test asdf]'
使用tokenExtents
代替,您将获得一个单元格数组,其中每个单元格都是向量[start,end]
。有了这些,您现在可以替换单词。
% Create example
txt = 'I''m going to replace just test in [] not the other [test] but still [asdf test asdf].';
word = 'test';
newWord = 'test1';
% Find all occurrences with regexp
ind = regexp(txt,['\[[^\]]*(',word,')[^\]]*\]'],'tokenExtents');
% Build new string
newTxt = txt(1:ind{1}(1)-1); % first part
for k=1:size(ind,2)-1 % all middle parts
newTxt = [newTxt,newWord,txt(ind{k}(2)+1:ind{k+1}(1)-1)];
end
newTxt = [newTxt,newWord,txt(ind{k+1}(2)+1:end)]; % last part
免责声明:我必须承认,特别是建立字符串可能会更好。也许有人想出一个更好的解决方案。