Regex 正则表达式来匹配字符串中的几个字符
我试图在另一个字符串中找到一个字符串。但是,即使一个或多个字符不匹配,我也会尝试匹配 让我举例说明: 假设我有一个字符串'abcdefghij'。现在,如果要匹配的字符串是“abcd” 我会写strfind('abcdefghij','abc') 现在,我有一个字符串“adcf”。注意,在两个字符中有一个错配,我认为它是一个匹配。 知道怎么做吗 我知道,这不是最理想的代码 例如:Regex 正则表达式来匹配字符串中的几个字符,regex,string,algorithm,Regex,String,Algorithm,我试图在另一个字符串中找到一个字符串。但是,即使一个或多个字符不匹配,我也会尝试匹配 让我举例说明: 假设我有一个字符串'abcdefghij'。现在,如果要匹配的字符串是“abcd” 我会写strfind('abcdefghij','abc') 现在,我有一个字符串“adcf”。注意,在两个字符中有一个错配,我认为它是一个匹配。 知道怎么做吗 我知道,这不是最理想的代码 例如: a='abcdefghijk'; b='xbcx' c='abxx' d='axxd' e='abcx' f='xa
a='abcdefghijk';
b='xbcx'
c='abxx'
d='axxd'
e='abcx'
f='xabc'
g='axcd'
h='abxd'
i ='abcd'
所有这些字符串都应与a
匹配。我希望这个例子能更清楚地说明这一点。其思想是,如果还有1或2个字符不匹配,则应将其视为匹配。在代码中
c=a-b
无效(矩阵尺寸不相同)
如果您至少需要一个匹配项,而不是顺序(如您的示例所示),您可以使用以下内容:-
>> a='abcdefgh';
>> b='adcf';
>> sum(ismember(a,b)) ~= 0
ans =
1
在代码中
c=a-b
无效(矩阵尺寸不相同)
如果您至少需要一个匹配项,而不是顺序(如您的示例所示),您可以使用以下内容:-
>> a='abcdefgh';
>> b='adcf';
>> sum(ismember(a,b)) ~= 0
ans =
1
在代码中
c=a-b
无效(矩阵尺寸不相同)
如果您至少需要一个匹配项,而不是顺序(如您的示例所示),您可以使用以下内容:-
>> a='abcdefgh';
>> b='adcf';
>> sum(ismember(a,b)) ~= 0
ans =
1
在代码中
c=a-b
无效(矩阵尺寸不相同)
如果您至少需要一个匹配项,而不是顺序(如您的示例所示),您可以使用以下内容:-
>> a='abcdefgh';
>> b='adcf';
>> sum(ismember(a,b)) ~= 0
ans =
1
你可以这样做:
A = 'abcdefghij'; % Main string
B = 'adcf'; % String to be found
tolerance = 2; % Maximum number of different characters to tolerate
nA = numel(A);
nB = numel(B);
pos = find(sum(A(mod(cumsum([(1:nA)' ones(nA, nB - 1)], 2) - 1, nA) + 1) == repmat(B, nA, 1), 2) >= nB - tolerance);
在这种情况下,它将返回pos=[13]因为“adcf”可以在第一个位置匹配(匹配“a?c”)和第三个位置匹配(匹配“?d?f”)
说明:
- 首先,我们取A和B的大小
- 然后,我们创建矩阵
,这为我们提供了:[(1:nA)'ones(nA,nB-1)]
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 为了实现这一目标,我们使用以下方法对右侧进行累积求和:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后使用函数,使每个数字介于1和nA之间,如下所示:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后,我们使用该矩阵作为矩阵的索引
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
注:该矩阵具有大小为nB的A的所有可能子字符串
- 现在我们用来复制B下的“nA行”
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 并进行直接比较:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 对右图求和,得出以下结论:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
这是每个可能的子字符串上的字符匹配数
- 最后,我们使用在我们的容差范围内选择匹配的索引
- 您可以这样做:
A = 'abcdefghij'; % Main string
B = 'adcf'; % String to be found
tolerance = 2; % Maximum number of different characters to tolerate
nA = numel(A);
nB = numel(B);
pos = find(sum(A(mod(cumsum([(1:nA)' ones(nA, nB - 1)], 2) - 1, nA) + 1) == repmat(B, nA, 1), 2) >= nB - tolerance);
在这种情况下,它将返回pos=[13]因为“adcf”可以在第一个位置匹配(匹配“a?c”)和第三个位置匹配(匹配“?d?f”)
说明:
- 首先,我们取A和B的大小
- 然后,我们创建矩阵
,这为我们提供了:[(1:nA)'ones(nA,nB-1)]
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 为了实现这一目标,我们使用以下方法对右侧进行累积求和:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后使用函数,使每个数字介于1和nA之间,如下所示:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后,我们使用该矩阵作为矩阵的索引
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
注:该矩阵具有大小为nB的A的所有可能子字符串
- 现在我们用来复制B下的“nA行”
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 并进行直接比较:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 对右图求和,得出以下结论:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
这是每个可能的子字符串上的字符匹配数
- 最后,我们使用在我们的容差范围内选择匹配的索引
- 您可以这样做:
A = 'abcdefghij'; % Main string
B = 'adcf'; % String to be found
tolerance = 2; % Maximum number of different characters to tolerate
nA = numel(A);
nB = numel(B);
pos = find(sum(A(mod(cumsum([(1:nA)' ones(nA, nB - 1)], 2) - 1, nA) + 1) == repmat(B, nA, 1), 2) >= nB - tolerance);
在这种情况下,它将返回pos=[13]因为“adcf”可以在第一个位置匹配(匹配“a?c”)和第三个位置匹配(匹配“?d?f”)
说明:
- 首先,我们取A和B的大小
- 然后,我们创建矩阵
,这为我们提供了:[(1:nA)'ones(nA,nB-1)]
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 为了实现这一目标,我们使用以下方法对右侧进行累积求和:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后使用函数,使每个数字介于1和nA之间,如下所示:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后,我们使用该矩阵作为矩阵的索引
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
注:该矩阵具有大小为nB的A的所有可能子字符串
- 现在我们用来复制B下的“nA行”
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 并进行直接比较:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 对右图求和,得出以下结论:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
这是每个可能的子字符串上的字符匹配数
- 最后,我们使用在我们的容差范围内选择匹配的索引
- 您可以这样做:
A = 'abcdefghij'; % Main string
B = 'adcf'; % String to be found
tolerance = 2; % Maximum number of different characters to tolerate
nA = numel(A);
nB = numel(B);
pos = find(sum(A(mod(cumsum([(1:nA)' ones(nA, nB - 1)], 2) - 1, nA) + 1) == repmat(B, nA, 1), 2) >= nB - tolerance);
在这种情况下,它将返回pos=[13]因为“adcf”可以在第一个位置匹配(匹配“a?c”)和第三个位置匹配(匹配“?d?f”)
说明:
- 首先,我们取A和B的大小
- 然后,我们创建矩阵
,这为我们提供了:[(1:nA)'ones(nA,nB-1)]
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 为了实现这一目标,我们使用以下方法对右侧进行累积求和:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 然后使用函数,使每个数字介于1和nA之间,如下所示:
1 1 1 1
2 1 1 1
3 1 1 1
4 1 1 1
5 1 1 1
6 1 1 1
7 1 1 1
8 1 1 1
9 1 1 1
10 1 1 1
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 11
9 10 11 12
10 11 12 13
1 2 3 4
2 3 4 5
3 4 5 6
4 5 6 7
5 6 7 8
6 7 8 9
7 8 9 10
8 9 10 1
9 10 1 2
10 1 2 3
abcd
bcde
cdef
defg
efgh
fghi
ghij
hija
ijab
jabc
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
adcf
1 0 1 0
0 0 0 0
0 1 0 1
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
2
0
2
0
0
0
0
0
0
0
- 我们