Octave - 在单元数组中返回字符串第一次出现的位置

6

Octave中是否有一个函数可以返回单元数组中字符串的第一次出现的位置?

我发现findstr可以实现此功能,但它返回一个向量,而我不需要。我想要像index那样的结果,但它只适用于字符串。

如果没有这样的函数,你有任何关于如何解决这个问题的建议吗?


您是想获取每个单元格中第一次出现的值,还是整个单元格数组中的第一次出现的值? - sco1
重新打开了重复的问题,因为这个问题要求找到字符串的第一次出现,而不是所有出现。被接受的答案还处理了无法找到字符串的细微差别。 这个问题有一个根本性的区别,导致需要不同的解决方案。 - rayryeng
1个回答

8
随着findstr的弃用,结合findstrcmpi可能会很有用。 strcmpi通过忽略字母大小写来比较字符串,这对于您的目的可能很有用。 如果这不是您想要的,请使用没有尾随i的函数,例如strcmp。 输入到strcmpistrcmp的是要搜索的字符串str,对于您的情况,附加输入参数是一个字符串数组Astrcmpistrcmp的输出将给出一个逻辑向量,其中每个位置k告诉您单元格数组A中的字符串k是否与str匹配。 然后,您将使用find查找字符串匹配的所有位置,但是您可以通过指定最大位置数n以及约束搜索的位置来进一步限制它 - 具体而言,如果您想查看第一个或最后一个匹配字符串的n个位置。
如果所需字符串在str中,并且您的单元格数组存储在A中,请执行以下操作:
index = find(strcmpi(str, A)), 1, 'first');

需要重申的是,find会找到所有字符串匹配的位置,而第二个和第三个参数告诉你只返回结果的第一个索引。具体来说,这将返回所搜寻的字符串的第一次出现,或者如果找不到,则返回空数组。

示例运行

octave:8> A = {'hello', 'hello', 'how', 'how', 'are', 'you'};
octave:9> str = 'hello';
octave:10> index = find(strcmpi(str, A), 1, 'first')
index =  1
octave:11> str = 'goodbye';
octave:12> index = find(strcmpi(str, A), 1, 'first')
index = [](1x0)

2
值得注意的是,strcmp/strcmpi 只比较完整的字符串,因此如果你正在搜索子字符串的存在,你可能需要使用正则表达式。 - sco1
@excaza 很好的评论。我假设 OP 想要搜索完整字符串。语言表明是这样,但我的假设以前已经让我吃过亏了。 - rayryeng
1
@rayryeng 这太完美了!谢谢你。而且你的假设是正确的,我想要搜索完整的字符串。 - CH123
1
@CH123 非常好,那么上面的代码将非常适合你的需求。祝你好运! - rayryeng
@rayryeng,感谢您的好回答。但是我在您的回答上面找不到excaza的任何评论。也许它已经被删除了。您介意相应地编辑您的答案吗? - Md. Abu Nafee Ibna Zahid
@Md.AbuNafeeIbnaZahid 这是一条评论,但很不幸我记不起他说了什么。 - rayryeng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接