ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4301|回复: 7

[原创] [字符系列3] find与search的悲欢离合(对函数所谓大小写的测试与发现)

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-5 09:26 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:FIND
本帖最后由 流浪铁匠 于 2018-4-5 09:49 编辑

前文链接
[字符系列1]char与code的恩怨情仇
http://club.excelhome.net/thread-1397754-1-1.html
[字符系列2]看不见,不代表不存在的不可见字符
http://club.excelhome.net/thread-1397802-1-1.html

本篇为《char与code的恩怨情仇》的续集,也是对excel在公式中字符性质的继续探索                                                                        
本篇名为find与search,但除了这2个函数外还对unicode字符有进一步探索,对函数定义中的大小写定义也有一些发现                                                                        
老规矩,本人对各类字符集没什么研究,一切测试都是在excel上完成的,由于函数限制想要自行测试最好使用2013以上版本

一,find与search的区别
find和seacrh,都是用于查找某字符串在另一字符串的位置
大家众所周知的区别在于:
1,search支持通配符,但find不支持
2,find识别大小写,但search不支持
从这2点衍生出来,这2个函数在一些情况下还有别的区别:
3,字符数限制:search的1参,字符数不能高于255,似乎支持通配符的函数在查找方面一定程度上都有这个限制
find无此限制 1.jpg

4,search所谓的支持大小写,并不仅限于英文字母
希腊字母,少数特殊字符乃至汉字,均存在find不能识别但search能识别的情况(目前合计发现1835组)

2.jpg

以上只是一些典型例子,附表含遍历后发现的所有具有该性质的各组字符,合计1835组
以上发现说明search(其他支持通配符的函数性质类似)所谓的忽略大小写并不准确
一些特殊字符似乎并不是大小写关系,但search等这类函数都是可忽略其区别
5,引用空单元格或缺省的差异                                                
2个函数虽然1/2参数说明为文本,但数值可以不使用""仍然可以正常识别
但1/2参数引用空单元格与直接缺省时2个函数存在区别
3.jpg 事实证明find可以缺省1参和2参,引用空单元格或直接缺省1参都会视为""
但在search不行,缺省参数即报错(好吧这条其实没什么用,我凑字数的)

find与search的悲欢离合.rar

160.17 KB, 下载次数: 367

含忽略大小写的1835组字符列表

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-5 09:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
二,find与search两个函数的常用查找手段                                               
未单独说明的2个函数均可实现,仅列find公式                                               
1,找对应字符第1次出现的位置(以下例子均在字符串"a1a222a3a4a55a6666"中找"a")                                               
=find("a","a1a222a3a4a55a6666")                                               
最基础的查找方式,其中search支持通配符,而且通常3参被习惯性缺省                                       
                                               
2,找对应字符第2次出现的位置                                               
=find("a","a1a222a3a4a55a6666",find("a","a1a222a3a4a55a6666")+1)                                               
使用了find的3参,如果次数较高套嵌次数多不建议使用,请使用第3种查找思路                                               
                                               
3,找对应字符第n次出现的位置                                               
=find("#",substitute("a1a222a3a4a55a6666","a","#",N))                                               
使用一个源数据未出现的字符,借助substitite的4参替换进行查找来达到效果,其他一些特殊次数查找也可使用                                               
                                               
4,找对应字符最后1次出现的位置                                               
=count(find("a","a1a222a3a4a55a6666",row(1:99)))                                               
使用了find3参性质实现,且count的优点之一为忽略错误值,是find与search的好搭档                                               
                                               
5,找第1个单字节字符的位置(仅searchb)                                               
=searchb("?",字符串)                                               
利用searchb这类函数对单字节字符与双字节字符的区别对待且支持通配符的能力实现的特殊应用                                               
                                               
6,找第1个数字的位置                                               
=min(find(row(1:10)-1,字符串&5^19))                                               
                                               
7,找第1个英文字符的位置(区分大小写,适合find,不区分换成search)                                               
=AGGREGATE(15,6,FIND(CHAR(ROW(65:90)),字符串),1)                                               
                                               
8,find与search的拖油瓶                                               
在6中使用了 &5^19 的方式避免find产生错误值,因为这个值包含所有10个数字                                               
除此外 1/17 , &原查找内容 等方式均常用于find和search的容错,避免产生错误值影响后续计算                                               
                                               
9,计字符串中数字的不重复个数                                               
=COUNT(FIND(ROW(1:10)-1,12345321))                                               
利用find与search基本用法只找第1次出现的位置的方式与count配合进行不重复计数                                               
                                               
10,计字符串中不重复的字母个数(忽略大小写)                                               
=COUNT(SEARCH(CHAR(ROW(65:90)),"abAcdeBbcE"))                                               
                                               
11,计字符串中双字节字符的个数(数据源无空格)                                               
=COUNT(FIND(" ",MIDB("任意汉字fanzheng凑数",ROW(1:50),1)))/2                                               
利用midb这类函数对双字节字符提取时只提取1个字符返回空格的方式进行计数                                               
                                               
12,计字符串中指定内容的连续最大数量                                               
=COUNT(FIND(REPT(1,ROW(1:50)),"1112112312341111432112"))                                               
遍历的思路                                               
                                               
13,计字符串从右往左以1开头的连续1的个数                                               
=COUNT(FIND(RIGHT("1112112312341111432111",ROW(1:50)),REPT(1,50)))                                               
和上面几个思路类似,利用遍历方式获取结果                               

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-5 09:42 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 流浪铁匠 于 2018-4-5 09:43 编辑

三,unicode字符的进一步探索                                                
这部分是字符系列的延续,其中少数内容和这2个函数有关,故仍归在这篇内                                                
以下均针对unicode编码大于65535的unicode字符,不再解释                                                
由于早期版本不支持,多数公式将以截图形式列出                                                
1,mid分出半个字符(接《char与code的恩怨情仇》)
4.jpg
查询具体编码后测试基本可以确认是mid的提取结果为unicode编码,而且只有一半,这点与left/right存在很大区别
由以上各种结果推断:
1,mid与left/right的提取记录存在很大差异,前者偏向字符编码,后者趋于字符本身
2,unicode编码大于65535的字符,编码的字节数量为普通字符的2倍,mid提取1个字符仅提取一半的编码
3,mid分别提取的2部分编码可重新组合为字符,验证了上面的结论

5.jpg

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-6-6 14:55 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-6-6 15:04 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
流浪铁匠 发表于 2018-4-5 09:42
三,unicode字符的进一步探索                                                
这部分是字符系列的延续, ...

敬佩铁匠的专研精神!

TA的精华主题

TA的得分主题

发表于 2018-11-19 22:18 | 显示全部楼层
本帖最后由 beanchan 于 2018-11-20 14:20 编辑

学习,佩服铁匠

TA的精华主题

TA的得分主题

发表于 2019-1-16 13:51 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这是研究得有多透彻啊?佩服

TA的精华主题

TA的得分主题

发表于 2019-11-11 13:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
读了不少铁匠的好帖子,敬佩“铁匠精神”——炉火纯青的基本功(炉火得旺),够硬的锤子(好工具,全版本EXCEL),一副好身板,还有执着的研究精神。

对于Sheet1的第一部分的第5小点,关于使用空单元格和缺省的描述,我有一点小的补充。

更准确的描述应该是,FIND可以接受二参是空单元格或者缺省的情况,而SEARCH不能接受二参是空单元格或者缺省的情况。对于一参,不管是空单元格,还是缺省,FIND和SEARCH应该都是可以接受的,返回值总是特殊的1。

举例应该不难,为了快速回复,和不喧宾夺主,我就不贴附件举例了。


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-23 05:40 , Processed in 0.046556 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表