-1

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

在此处输入图像描述

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

4

1 回答 1

1

如果我正确理解您的问题,您希望找到L包含与某些位置相同的字母(字符)的子字符串S(假设由 array 给出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

似乎是正确的。

于 2013-04-02T17:31:34.863 回答