与其尝试在单个regex 中执行此操作,不如尝试提取<> 之间的所有字符串,找到那些具有_ 字符的字符并用空格包围这些字符,然后重建最终的字符串?我会首先使用regexp 来查找字符串中那些有<> 包围字符串的区域,然后执行我上面提到的操作......所以先这样做:
[st, en, match] = regexp(s, '<.*?>', 'start', 'end', 'match')
这会找到所有在子字符串周围有<> 的字符串。 start 和 end 标志确定字符串中开始和结束索引中的哪些索引与我们正在查找的内容匹配。在我们的例子中,start 告诉您每个 < 字符在哪里,end 告诉您每个 > 字符在哪里。 match 是一个字符串元胞数组,与我们对 <> 子字符串的搜索相匹配。这些分别存储在st、en和match中。完成后,让我们在 match 上添加一个 regexprep,并在 _ 字符前后放置空格。
final_match = regexprep(match, '_', ' _ ');
现在要重构最终的字符串,我们首先将字符从开头放置到第一个 < 出现,然后我们将编写一个循环将所有内容拼凑在一起,然后当我们找到最后一个 > 字符, 将所有字符加到最后.... 就像这样:
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)];
第一行从原始字符串中提取内容,直到第一次出现< 字符。接下来,对于<> 字符之间的每个子字符串(也包括这些字符),我们将修改后的字符串放置在_ 字符之间,然后我们在> 字符之间访问这些字符当前子字符串到下一个子字符串的< 字符,我们重复这个过程,直到我们碰到最后一个< 字符。一旦我们点击了最后一个< 字符,我们就放置最后一个<> 修改后的子字符串,最后将原始字符串的最后一个片段放在末尾。如果我们在您的示例中使用上面的代码,我们会得到:
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>.
如您所见,_ 字符之间的所有单词在<> 字符之间都有空格。但是,这仅在至少有一个<> 字符序列时才有效。如果没有,则上面的代码不起作用。因此,您需要检查match(或start 或end)是否至少有一个元素。如果是,则继续执行上述代码。如果没有,就吐出原来的字符串。