String 包含多个模式中每个模式的单独结果
函数String 包含多个模式中每个模式的单独结果,string,matlab,String,Matlab,函数TF=contains(str,pattern)的Matlab文档说明: 若pattern是一个包含多个pattern的数组,那个么contains在str中找到pattern的任何元素时返回1 但是,我希望每个模式都有一个单独的结果。 即: 我有stringA='一个很长的string'和两种模式B='very'和C='long'。我想检查B是否包含在A中,以及C是否包含在A中。我可以这样做: result = false(2,1); result(1) = contains(A,B);
TF=contains(str,pattern)
的Matlab文档说明:
若pattern是一个包含多个pattern的数组,那个么contains在str中找到pattern的任何元素时返回1
但是,我希望每个模式都有一个单独的结果。
即:
我有stringA='一个很长的string'
和两种模式B='very'
和C='long'
。我想检查B
是否包含在A
中,以及C
是否包含在A
中。我可以这样做:
result = false(2,1);
result(1) = contains(A,B);
result(2) = contains(A,C);
但对于许多模式来说,这需要相当长的时间。做这件事的最快方法是什么?我不知道或无法使用该功能;它一定是“新的”,所以我不知道它的特殊特性 我将如何做到这一点:
result = ~cellfun('isempty', regexp(A, {B C}));
EIDT
从中可以看出,您可以使用contains
执行完全相同的操作:
result = contains(A, {B C});
除了返回
contains(A,B)| contains(A,C)
而不是数组[contains(A,B)contains(A,C)]
。所以我不知道,我不能在这里测试。但是,如果所有其他方法都失败了,您可以使用上面的regex
解决方案。16b中的新文本处理函数是使用字符串最快的。如果将字符串转换为字符串,您可能会看到更好的性能
function profFunc
n = 1E6;
A = 'a very long string';
B = 'very';
C = 'long';
tic;
for i = 1:n
result(1) = contains(A,B);
result(2) = contains(A,C);
end
toc;
tic;
for i = 1:n
x = regexp(A, {B,C});
end
toc;
A = string(A);
tic;
for i = 1:n
result(1) = contains(A,B);
result(2) = contains(A,C);
end
toc;
end
>> profFunc
Elapsed time is 7.035145 seconds.
Elapsed time is 9.494433 seconds.
Elapsed time is 0.930393 seconds.
问题:B和C来自哪里?你有很多硬编码的变量吗?你会打圈吗?循环可能是最快的。否则的话
cellfun(@(x)contains(A,x),{B C})
是一个选项。谢谢,regexp表达式似乎可以工作,与多次调用相比速度要快得多。您链接到的文档令人困惑,但是我不认为你所建议的用法实际上是按照问题所要求的方式工作的:
A
中包含B
或C
的每个元素将返回1,但不会告诉你哪一个是匹配的。regexp是一个更好的选择。@t是的,我所理解的正是您所说的,以及我在上一段中所写的内容——对于单个字符串a
,它返回一个true/false,表示给定的模式是否在该字符串中找到。奇怪的选择,这不是我通常遇到的用例。哦,好吧,我同意,这很奇怪;我通常不关心各种字符串是否匹配,我关心哪一个字符串匹配。我猜这是一个维度问题:因为任何维度的数组都可以作为第一个参数传入,也可以作为第二个参数传入,所以输出的格式可能会与高维数组混淆。