我有两个短(S,大小为 1x10)和很长(L,大小为 1x1000)字符串,我将在 L 中找到与 S 匹配的位置。
在这个特定的匹配中,我只是想匹配 S 中的一些特定字符串(黑色字符串)。matlab中是否有任何函数或方法可以匹配某些特定的字符串(例如S中的1、5、9的字符串编号)?
我有两个短(S,大小为 1x10)和很长(L,大小为 1x1000)字符串,我将在 L 中找到与 S 匹配的位置。
在这个特定的匹配中,我只是想匹配 S 中的一些特定字符串(黑色字符串)。matlab中是否有任何函数或方法可以匹配某些特定的字符串(例如S中的1、5、9的字符串编号)?
如果我正确理解您的问题,您希望找到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
似乎是正确的。