matlab中的字符串匹配

时间:2013-04-02 17:03:52

标签: string matlab computer-vision signals signal-processing

我有两个短(S大小为1x10)和非常长(L大小为1x1000)的字符串,我将在L中找到与S匹配的位置。

enter image description here

在这个特定的匹配中,我只想匹配S中的一些特定字符串(黑色字符串)。 matlab中是否有任何可以匹配某些特定字符串的函数或方法(例如S中的字符串编号为1,5,9)?

1 个答案:

答案 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

现在剩下的就是用regexpL提供所需的模式:

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

似乎没错。