有没有办法在Excel中的单元格中search所有匹配string的起始字符位置?

假设在电子表格的单元格A2中有“医生和护士”这个短语。 函数SEARCH(“the”,A2)将返回值1,表示find了“the”,并且它从字符1开始。但是,这不会告诉我是否有其他的,在这种情况下,有一个第二个“的”。 它也不会告诉我第二个“the”的开始索引。

所以我想知道是否有办法检索单元格中匹配string的所有起始字符位置。 我知道这可以通过编程语言轻松实现,但是对于目前我正在处理的任务,我只能使用Excel。

这里是另外一组公式,将返回search_for中所有起始位置的数组

区分大小写

 =FIND(CHAR(1),SUBSTITUTE(string,search_for,CHAR(1),ROW(INDIRECT("1:"&(LEN(string) - LEN(SUBSTITUTE(string,search_for,"")))/LEN(search_for))))) 

不区分大小写

 =FIND(CHAR(1),SUBSTITUTE(LOWER(string),LOWER(search_for),CHAR(1),ROW(INDIRECT("1:"&(LEN(string) - LEN(SUBSTITUTE(LOWER(string),LOWER(search_for),"")))/LEN(search_for))))) 

如果search_for不存在于string ,则公式将返回一个#REF! 错误。 如果需要,可以将整个公式包装在IFERROR函数中。

编辑 :根据您的评论,这里是能够看到数组的两个元素的一种方法。 该公式是用ctrl+shift+enter作为数组公式input到C1:C2中的。 为了更好地理解,我build议访问有关数组公式的Excel帮助。

在这里输入图像说明

FIND函数和SEARCH函数找不到search项的k个实例的位置,只有第一个实例。 但是, SUBSTITUTE函数可以用完全唯一的东西来replacesearch词的k实例,然后可以search它。

在字符串中搜索字符串的第n个实例

C3中的公式是,

 =FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), ROW(1:1))) 

根据需要填写。 使用IFERROR函数作为包装来捕捉#VALUE! 当您将实例耗尽到错误消息或空string中时引发的错误。

我用FIND作为LOWER函数 ,因为SUBSTITUTE区分大小写。

扩大到FIND返回的前9个可能的位置将使公式,

 =SUBSTITUTE(CHAR(123) & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 1)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 2)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 3)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 4)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 5)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 6)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 7)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 8)) & CHAR(44), "") & IFERROR(FIND(CHAR(215), SUBSTITUTE(LOWER(A$2), LOWER(B$2), CHAR(215), 9)) & CHAR(44), "") & CHAR(125), CHAR(44)&CHAR(125), CHAR(125)) 

结果: {1,16} (用CHAR(40)CHAR(41)代替CHAR(123)CHAR(125)将大括号改为括号)

进一步扩展这将是一个简单的复制/粘贴/重新编号操作。

假设A1有短语,B1有你要search的单词。 此公式将返回匹配的所有起始字符位置的数组。

 =SMALL(IF(ISNUMBER(IF(FREQUENCY(IF(ISNUMBER(SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),IF(ISNUMBER(SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1)))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1)))))),IF(FREQUENCY(IF(ISNUMBER(SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),IF(ISNUMBER(SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1)))))),SEARCH(B1,A1,ROW(INDIRECT("1:"&LEN(A1)))))),ROW(INDIRECT("1:"&(LEN(A1)-LEN(SUBSTITUTE(A1,B1,"")))/LEN(B1))))