Matlab正则表达式 - 仅在有角度的括号内替换子串

时间:2015-03-02 04:29:42

标签: regex string matlab

我想找到一种方法来找到一种方法来替换字符串_内的字符s,其中包含空格。唯一困难的部分是,我只是在有角度的括号内找到子串时才尝试替换子串。例如(空格是有意的):

s= 'the quick <_brown _little_fox >, jumped over_the_fence .

wantedresult = the quick < _ brown _ little _ fox>, jumped over_the_fence.

如果两边都有空间,那么获得额外的空间就完全可以了。

我试过以下但没有运气: regexprep(s, <[\w ]+(\_)[\w ]+>', ' $1 ');

我想我理解上述原因不起作用的原因,但考虑到括号内可能有多个_,我不知道该如何继续。

任何建议都将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:2)

为什么不尝试提取regex之间的所有字符串,找到那些具有<>字符和环绕声的字符,而不是尝试在单个_中执行此操作那些带空格的字符,然后重建最终的字符串?我会首先使用regexp来查找字符串中围绕字符串<>的那些区域,然后执行上面提到的操作....首先执行此操作:

[st, en, match] = regexp(s, '<.*?>', 'start', 'end', 'match')

这将查找围绕子字符串<>的所有字符串。 startend标志确定字符串中起始和结束索引中哪些索引与我们要查找的内容匹配。在我们的示例中,start告诉您每个<字符的位置,end告诉您每个>字符的位置。 match是一个字符串的单元格数组,匹配我们对<>子字符串的搜索。它们分别存储在stenmatch中。完成后,让我们在regexprep上执行match并在_个字符前后放置空格。

final_match = regexprep(match, '_', ' _ ');

现在重建最后的字符串,我们首先将字符从开头放到第一个<出现,然后我们将编写一个循环,将所有内容组合在一起,然后当我们找到最后一个{{ 1}}字符,将所有字符加到最后....所以类似于:

>

第一行从原始字符串中获取内容,直到第一次出现final_string = s(1:st(1)-1); for idx = 1 : numel(final_match)-1 final_string = [final_string final_match{idx}]; final_string = [final_string s(en(idx)+1:st(idx+1)-1)]; end final_string = [final_string final_match{end} s(en(end)+1:end)]; 字符。接下来,对于<个字符(也包括那些字符)之间的每个子字符串,我们放置修改后的字符串,在<>个字符之间放置空格,然后我们访问_字符之间的字符。 1}}当前子字符串的字符到下一个子字符串的>字符,我们重复此过程,直到我们点击最后一个<字符。一旦我们点击了最后一个<字符,我们将最后的<修改后的子字符串放在最后,最后将最后一个原始字符串分段。如果我们在您的示例中使用上述代码,我们会得到:

<>

如果我们修改了字符串final_string = the quick < _ brown _ little _ fox >, jumped over_the_fence. ,那么我们得到:

s

上面代码的输出是:

s =

the quick <_brown _little_fox >, < _jumped _over _the_ fence>.

正如您所看到的,final_string = the quick < _ brown _ little _ fox >, < _ jumped _ over _ the _ fence>. 个字符之间的所有单词的_字符之间都有空格。但是,这仅在至少有一个<>个字符序列时才有效。如果没有,则上述代码不起作用。因此,您需要检查<>(或matchstart)是否至少包含一个元素。如果是,则继续上面的代码。如果没有,只需吐出原始字符串。