Matlab Central Cody Problem 31
Problem 31. Remove all the words that end with "ain"
Given the string s1, return the string s2 with the target characters removed.
For example, given
s1 = 'the main event'
your code would return
s2 = 'the event'
Note the 2 spaces between “main” and “event” Only the four letters in the word “main” were deleted.
这个题目着重考察了对正则表达式的理解,如何能够识别到含有特定字符的单词,并且进行相对应的操作,是整个过程的大致思路。
下面首先是从GitHub上面看到的他人总结的答案,链接也顺便放一下:https://github.com/tuttelikz/MATLAB-Cody,其中涉及到了split函数、regexprep函数、strjoin函数和regexp函数,先是将原来的字符串给拆分开,看来以默认的方式拆开字符串就是以空格为分界线来拆分,之后通过正则表达式的替换,将以‘ain’结尾的单词给删除,重新连接形成新的字符串以后,需要对一个特殊情况进行补充判断,那就是当其中含有"ain"的时候,利用上述命令并不会将其识别为一个单词,所以通过第5行的一个看起来极为复杂的表达式进行判断和筛查,得到最后的下标后删除""中的"ain"完成任务。
function s2 = remAin(s1)
s1 = split(s1)
s1 = regexprep(s1,'\w*ain$','')
s1 = strjoin(s1)
[~,startIndex,endIndex] = regexp(s1,'(?<=")[^"]+(?=")','match');
s1(startIndex:endIndex) = []
s2 = s1;
end
那么关于正则表达式的理解,菜鸟教程当中整理的还是很全面的,可是目前对于第5行代码中‘+’的理解,还是不太清晰,暂时标注一下,慢慢根据更多例子来理解吧。
(菜鸟教程:
https://www.runoob.com/regexp/regexp-syntax.html
)
以下再放上一个官网上别人所提交的一个size更小的答案,只有两行代码,
function s2 = remAin(s1)
[~,noMatch] = regexp(s1,'\w*ain\>','match','split')
s2=[noMatch{:}];
end
这个方法没有涉及到特别复杂的正则表达式的运用,这里’\w*ain\>'就是用来筛选出以ain结尾的字母部分,最后把分割开的字符串重新组合到一起,得到去除ain结尾的单词部分的字符串。