我有两个短(S大小为1x10)和非常长(L大小为1x1000)的字符串,我将在L中找到与S匹配的位置。
在这个特定的匹配中,我只想匹配S中的一些特定字符串(黑色字符串)。 matlab中是否有任何可以匹配某些特定字符串的函数或方法(例如S中的字符串编号为1,5,9)?
答案 0 :(得分:1)
如果我正确理解了您的问题,您希望在L
中找到在某些位置包含与S
相同的字母(字符)的子字符串(假设由数组idx
给出) 。正则表达式在这里是理想的,因此我建议使用regexp
。
在正则表达式中,点(.
)匹配任何字符,花括号({}
)可选择指定所需出现的次数。例如,要匹配长度为6的字符串,其中第二个字符为“a”,第五个字符为“b”,我们的正则表达式可以是以下任何语法:
.a..b.
.a.{2}b.
.{1}a.{2}b.{1}
其中任何一个都是正确的。所以让我们首先构建一个正则表达式模式:
in = num2cell(diff([0; idx(:); numel(S) + 1]) - 1); %// Intervals
ch = num2cell(S(idx(:))); %// Matched characters
C = [in(:)'; ch(:)', {''}];
pat = sprintf('.{%d}%c', C{:}); %// Pattern for regexp
现在剩下的就是用regexp
和L
提供所需的模式:
loc = regexp(L, pat)
瞧!
我们假设:
S = 'wbzder'
L = 'gabcdexybhdef'
idx = [2 4 5]
首先我们构建一个模式:
in = num2cell(diff([0; idx(:); numel(S) + 1]) - 1);
ch = num2cell(S(idx(:)));
C = [in(:)'; ch(:)', {''}];
pat = sprintf('.{%d}%c', C{:});
我们得到的模式是:
pat =
.{1}b.{1}d.{0}e.{1}
显然我们可以添加美化这种模式的代码到.b.de.
,但这实际上是一种不必要的优化(regexp
也可以处理前者)。
我们之后:
loc = regexp(L, pat)
我们得到以下结果:
loc =
2 8
似乎没错。