在matlab中搜索特定区域

时间:2015-02-13 10:01:27

标签: regex matlab str-replace text-processing

我要在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].

我需要推动并弹出支架吗?还是有简单的方法?

2 个答案:

答案 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正是您要找的。
  • [^\]]*,对于任何数量不是]
  • 的字符
  • \]以[]
  • 结尾

您可以使用以下命令验证它是否找到了正确的事件(对于下面的示例)

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

免责声明:我必须承认,特别是建立字符串可能会更好。也许有人想出一个更好的解决方案。