Matlalb学习笔记 — Cody Problem31

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结尾的单词部分的字符串。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值