excel函数查找单元格中string的模式

我必须在一个单元格中find个人身份证件。 太糟糕了隐藏这个ID的单元格中的string可以是任何东西,ID可以在开始,结束,任何地方,但它在那里。 我唯一知道的是模式“空格,字母,字母,数字,数字,数字,数字,数字,数字,空格”。 吉科DB544345

我正在寻找这个“面具”的正确词汇,但找不到答案。 感谢您的帮助。

由于评论很多,我已经创build了一个最小的例子,它可能代表了OP所处理的内容:

A1: 123456789 DB544345 asdfg asdfghjk
A2: creating dummy data is a DB544345 pain
A3: DB5443456 and soething else

在ColumnB中用Text To Columns(以空格作为分隔符)parsing该文件的副本,然后应用:

 =IFERROR(IF(AND(LEN(B1)=8,CODE(LEFT(B1))>64,CODE(LEFT(B1))<91,CODE(MID(B1,2,1))>64,CODE(MID(B1,2,1))<91,ISNUMBER(RIGHT(B1,6)*1),RIGHT(B1,6)*1>99999),B1,""),"") 

到K1,将其复制到P1,然后将K1:P1复制下来。

对于像这样的问题,一个简洁的“内置函数”解决scheme需要一点点修补,因为内置的Excel公式中的缺陷和怪癖,许多尝试都会死胡同或需要解决方法。 我更喜欢单细胞公式,因为它们对通用电子表格结构的影响很小。 但是,由于上面列出的限制,复杂的单细胞解决scheme往往是以相当长和繁琐的代价(这个答案在Excel中我的公式栏上仍然只有两行)。 我回到你的问题,并拼凑出一个公式,可以(就我所testing的那样)用一个单元格公式提取出这种模式的第一次出现。 这是一个数组公式(Ctrl + Shift + Enter而不是Enter),假设你的数据在A2中。 如果找不到匹配,则粗略的公式会返回前8个字符,如果stringless于10个字符,则会引发#REF。

 =MID(A2,MIN(IF(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9))),1)=" ",IF(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+9,1)=" ",IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+1,1))>64,IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+1,1))<91,IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+2,1))>64,IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+2,1))<91,IF(IFERROR(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+3,6)*1>99999,FALSE),ROW(INDIRECT("A1:A"&(LEN(A2)-9)))))))))))+1,8) 

让我试图至less在高层次上打破这一点。 我们将主文本分成每个可能的十个字符块,以便我们可以使用@pnuts的build议来testing每个字符,以validation前两个字符的Unicode值,并对string的其余部分运行ISNUMBER检查。 这个第一块在我的公式中重复出现。 它生成从1到n-9的数字列表,其中n是我们的主要文本string的长度。

 ROW(INDIRECT("A1:A"&(LEN(A2)-9))) 

假设我们的string长度为40个字符,并用{1...31}replace上面的公式。 使用这个数字序列生成,我们可以检查字符1到31是否是空格:

 IF(MID(A2,{1...31},1)=" " 

那么我们可以检查字符10到40是否是空格:

 IF(MID(A2,{1...31}+9,1)=" " 

然后我们可以检查字符2到32是否是大写字母:

 IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+1,1))>64, IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+1,1))<91 

然后我们可以检查字符3到33是否是大写字母:

 IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+2,1))>64, IF(CODE(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+2,1))<91 

然后我们可以检查字符4到9,5到10,…,33到38,34到39的string是六位数字:

 IF(IFERROR(MID(A2,ROW(INDIRECT("A1:A"&(LEN(A2)-9)))+3,6)*1>99999,FALSE) 

如果所有条件都为TRUE,那么10位块testing将通过原始数组{1...31}另一个实例返回string中第一个字符的索引。 否则它不会返回 我们取所有回归指标的Min ,然后用Mid函数来抓取由上述最小指标决定的8位数字串:

 =MID(A2,MIN(matching index list)+1,8) 

如果我们假设SPACE的开头和结尾只是为了区分ID和其他string,我认为这将起作用。 因此如果ID在string的开头或末尾就不会出现。 这个公式是不区分大小写的。 如果需要区分大小写,我们可以进行字符代码比较。

 =LOOKUP(2,1/((LEFT(myArr,2)>="AA")*(LEFT(myArr,2)<="ZZ")*(LEN(myArr)=8)*ISNUMBER(-RIGHT(myArr,6))),myArr) 

myArr指的是:

 =TRIM(MID(SUBSTITUTE(TRIM(Sheet2!A1)," ",REPT(" ",99)),(ROW(INDIRECT("1:10"))-1)*99+1,99)) 

如果myArr最初是用B1中的光标定义的,参照如图所示的A1,它将调整为引用名称出现的单元格左边的单元格。

1:10中的1:10是string中的最大字数 – 可以根据需要进行调整。