将string拆分成具有特定模式和条件的部分

我有如下几个5k +string的数组作为某些应用程序的输出(出于安全原因,我可能不提供确切的数据,但示例格式与实际数据非常相似):

kasdfhkasdhfaskdfj42345sdsadkfdkfhasdf5345534askfhsad asdfasdf66sdafsdfsdf4560sdfasdfasdf sdfaasdfs96sadfasdf65459asdfasdf sadfasdf8asdfasdas06666654asdfasdfsd fasdjfsdjfhgasdf6456sadfasdfasdf9sdfasdfsadf 

简单地说,我有非破坏性的字母数字string,由5个部分组成

 [latin letters][1 or more digits][latin letters][1 or more digits][latin letters] 

字母部分的长度,以及数字的数量是随机的,整个string的长度可以从几个变化到2-3 字符,但是模式仍然如上。

实际上,我对前导string和尾随string部分很感兴趣,即[1 or more digits][latin letters][1 or more digits]可能被丢弃,但另外2个string应该被提取以分隔单元格。

我尝试了SUBSTITUTESEARCHfunction,但是我仍然可能无法处理随机数字的数字。 VBA是最后期望的方法,但是如果纯粹的公式是无用的,则是可以接受的。 此外,解决scheme应该是灵活的,以便将来可能使用类似的模式 – 所以任何正确的指导/一般方法将不胜感激。

如果您不介意使用MS Word而不使用Excel,那么对于涉及使用通配符的内置Search and Replace例程的这些任务,有一种非常简单的方法。 假设数据可能在Word中打开,请执行以下操作:

  1. CTRL + Hreplace对话框打开。
  2. 勾选Use wildcards选项。
  3. 你想扔掉的部分数据匹配以下模式: [0-9]{1,}*[0-9]{1,} – 这意味着任何数字1次或更多次之间的任何字符。 取决于您需要的区域设置; 而不是在这里。
  4. 指定你喜欢的任何字符作为replace,例如^t (Tab)或; – 进一步拆分零件。
  5. 执行更换。
  6. 或者,您可以使用function区Insert > Table > Convert Text to Table...function将其余的Insert > Table > Convert Text to Table...

您现在只需要保存/粘贴所获得的结果。

实际上,这个方法非常强大,许多类似于你的常规文本数据parsing任务可能会很快完成,而没有特殊的技能和/或编程。 而且你不需要任何第三方工具 – 现在每台电脑都安装了Word。

详细了解模式和适用案例:

  • 使用通配符查找和replace
  • 使用通配符查找和replace字符

基于这个来自伟大的chandoo的教程 (如果你想在excel中变得棒极了,你应该遵循这个教程 :

使用这个公式(注意一个数组公式,你需要input它+ ENTER + SHIFT + CTRL )来提取

 {=MIN(IFERROR(FIND(lstNumbers,G6),""))} 

其中lstNumbers是单元格中包含0-9(单元格中的每个数字)和e1中包含数据的单元格中的命名范围。

这将返回第一个数字,然后你可以提取第一部分:

 =LEFT(E1,G1-1) 

其中e1包含数据和g1前面的公式

得到你使用的数字部分的结尾:

 {=MAX(IFERROR(FIND(lstNumbers,E1),""))} 

那么你可以使用mid来提取数值部分,并使用len(datacell) – len(从max函数)来提取右边(或中间)剩下的string。 在那里我们将使用相同的处理 – 获得第一个数字与最小,最后与最大等

祝你好运! 这是一个真正的难题,用真正的编程语言来做这个也许会更容易

更新:

这个数组公式会给你第一个string部分:

  =LEFT(A1,MATCH(0,1*ISERROR(1*MID(A1,ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1) 

这个数组公式会给你最后一个string部分:

  =RIGHT(A1,MATCH(0,1*ISERROR(1*MID(A1,LEN(A1)+1-ROW(INDIRECT("$A1:$A"&LEN(A1))),1)),0)-1)