发现同时包含多个子字符串的字符串
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
2015年4月8日
子字符串的顺序已知和固定吗?如果他们有一个固定的顺序,那么这可能是使用一个简单的正则表达式来解决。如果订单是未知的,因为您的代码目前解决,这需要两个解析的字符串或某种预处理。
接受的答案
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的评论
答案(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))
这样做有意义吗?
谢谢,
斯文。