发现同时包含多个子字符串的字符串

126(30天)
嗨,我有一个字符串数组,我想确定所有这些条目包含两个子字符串在同一时间。例如:
我的字符串:“第一个例子”,“第二个例子”,“第三个例子”
我的子字符串:“国税局”、“xam”
所以我想确定第一个字符串作为唯一一个同时包含子字符串。我找到了一个解决方案,但我相信,必须有一个更简洁和有效的实现这一目的的方法。我的代码如下:
清楚,clc;
%设置变量
rbCode = {“RB_DEP_LI_EQ_EED”;
“RB_DEP_LI_EQ_EED_INV”;
“RB_DEP_LI_EQ_EED_TRS”;
“RB_DEP_LI_EQ_IED”
“RB_DEP_LI_EQ_IED_INV”;
“RB_DEP_LI_EQ_IED_TRS”;
“RB_DEP_LI_FI_INV”};
rbMarketValue = {100;80;20;70;40;30;20};
%比较投资市场价值
strToFind = {“情商”;“_INV”};
%总结所有rbCodes rbMarketValue都“情商”和“_INV”
%他们的名字
= arrayfun (@ (x) strfind (rbCode, char (strToFind (x))), 1:尺寸(strToFind),“联合国”、假);
a1 = arrayfun (@ (x)逻辑(~ isempty (cell2mat ({1 1} (x, 1)))), 1:尺寸(rbCode));
a2 = arrayfun (@ (x)逻辑(~ isempty (cell2mat ({1,2} (x, 1)))), 1:尺寸(rbCode));
a3 =总和([a1 ' a2 '], 2);
a4 = cell2mat (rbMarketValue);
sumDeptInv =总和(a4 (a3 = = 2));
任何建议我可以如何实现这一目标?由于斯文
2的评论
Stephen23
Stephen23 2015年4月8日
子字符串的顺序已知和固定吗?如果他们有一个固定的顺序,那么这可能是使用一个简单的正则表达式来解决。如果订单是未知的,因为您的代码目前解决,这需要两个解析的字符串或某种预处理。

登录置评。

接受的答案

Stephen23
Stephen23 2015年4月8日
编辑:Stephen23 2015年4月9日
实际使用 strfind 通常比使用更快 正则表达式 ,它有明显的优势,所有的字符都是按字面意思理解(而不是等特殊字符 正则表达式 )。 strfind 可以使用你的任务很紧:
rbCode = {“RB_DEP_LI_EQ_EED”;
“RB_DEP_LI_EQ_EED_INV”;
“RB_DEP_LI_EQ_EED_TRS”;
“RB_DEP_LI_EQ_IED”
“RB_DEP_LI_EQ_IED_INV”;
“RB_DEP_LI_EQ_IED_TRS”;
“RB_DEP_LI_FI_INV”};
strToFind = {“情商”;“_INV”};
> >有趣= @ (s) ~ cellfun (“isempty”strfind (rbCode s))
> > = cellfun (strToFind乐趣,“UniformOutput”假)
> > idx =所有(horzcat ({}), 2)
idx =
0
1
0
0
1
0
0
2的评论
乔斯(10584)
乔斯(10584) 2015年4月9日
编辑:乔斯(10584) 2015年4月9日
这是一个正则表达式的方式解决这个(但我也喜欢紧张的解决方案发布由史蒂芬!)
tf = cellfun (@ (x)元素个数(x) = = 2,正则表达式(rbCode sprintf (%年代|,strToFind {:})))

登录置评。

答案(1)

斯文
斯文 2015年4月8日
编辑:斯文 2015年4月8日
你好斯文,
这是我会怎么做。它使用一个电话 正则表达式 (您也可以使用 strsplit )和一个 cellfun 。构建一个查找表的好处是,如果您的数据是非常大的,只会有一个初始“打击”的字符串比较处理构建查找表,在那之后你会处理逻辑面具所以任何后续问题你问(说,如果你选择一双不同的编码)将非常有效:
%设置问题
rbCode = {“RB_DEP_LI_EQ_EED”;
“RB_DEP_LI_EQ_EED_INV”;
“RB_DEP_LI_EQ_EED_TRS”;
“RB_DEP_LI_EQ_IED”
“RB_DEP_LI_EQ_IED_INV”;
“RB_DEP_LI_EQ_IED_TRS”;
“RB_DEP_LI_FI_INV”};
rbMarketValues = [100;80;20;70;40;30;20);
strToFind = {“情商”;“发票”};
%找到所有代码和建立一个查找表显示存在
rbToks = regexp (rbCode,“_”,“分裂”);
代码=独特([rbToks {}):);%你不会需要这个如果你已经有一个列表
codeLookup = cell2mat (cellfun (@ (tok) ismember(代码,托托),rbToks,“联合国”,0));
%看看你的查找,看看哪个条目均码
hasBothMask =所有(codeLookup (:, ismember(代码,strToFind)), 2);
sumDeptInv =总和(rbMarketValues (hasBothMask))
这样做有意义吗?
谢谢,
斯文。
1评论
SpeedyGonzales
SpeedyGonzales 2015年4月9日
谢谢斯文!这个答案是。我想学习更多关于正则表达式对我很有益,因为这似乎是非常灵活的和强大的。

登录置评。

下载188bet金宝搏

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!