有没有办法在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它。
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))))