复杂的文本提取

我在单元格A1中有这个文本:

年龄风险:非常低位置风险:非常高

我想find第一个冒号(“:”)和第二个冒号左边的第二个空格之间的文本。 单元格内容可能会发生显着变化,但使用此逻辑应始终捕获必要的文本。 在这个特定的情况下,我试图隔离“非常低”

我可以find冒号的位置(“:”)

  • 1st = FIND(“:”,A1) – 位置9
  • 第二个= FIND(“:”,A1,FIND(“:”,A1)+1) – 位置33

但是,我不知道如何计算第二个冒号左边的两个空格,以便能够在MID中使用它。

=MID(A1,FIND(":",A1)+2,(location of 2nd space to left of 2nd colon -FIND(":",A1))) 

你可以用一个复杂的公式来做,但使用UDF和正则expression式要简单得多。 以下UDF

  • 除去第一个冒号后的所有空格
  • 然后它捕获所有的东西,直到通过outlook,它可以是一个序列
  • 然后在那之后删除所有的东西。

这样做的一个优点是,如果您发现描述并不总是匹配,则更容易进行修改。

 Option Explicit Function ExtractSpecial(S As String) As String Dim RE As Object Set RE = CreateObject("vbscript.regexp") With RE .Pattern = "^[^:]+:\s+(.*?)(?=\s+\S+\s+\S+:).*" .MultiLine = True ExtractSpecial = .Replace(S, "$1") End With End Function 

正则expression式模式的解释和进一步解释的链接:

^ [^:] +:\ s +(。 ?)(?= \ s + \ S + \ s + \ S + :)。

 ^[^:]+:\s+(.*?)(?=\s+\S+\s+\S+:).* 

选项:不区分大小写; ^ $在换行符不匹配

  • 断言string ^ 的开始位置
  • 匹配任何不是冒号字符 [^:]+ 字符
    • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
  • 匹配冒号字符 :
  • 匹配一个“空白字符” \s+ 的单个字符
    • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
  • 匹配下面的正则expression式并将其匹配到反向引用编号1 (.*?)
    • 匹配任何不是换行符的单个字符 .*?
      • 在零和无限次之间,尽可能less的次数,按需扩展(懒惰) *?
  • 断言下面的正则expression式可以从这个位置开始匹配(正向) (?=\s+\S+\s+\S+:)
    • 匹配一个“空白字符” \s+ 的单个字符
      • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
    • 匹配不是“空白字符” \S+ 的单个字符
      • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
    • 匹配一个“空白字符” \s+ 的单个字符
      • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
    • 匹配不是“空白字符” \S+ 的单个字符
      • 在一次和无限次之间,尽可能多的次数,根据需要回馈(贪婪) +
    • 匹配冒号字符 :
  • 匹配任何不是换行符的单个字符 .*
    • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪) *

$ 1

  • 通过捕获组号1 $1 插入上次匹配的文本

用RegexBuddy创build

假设你总是有“位置”在那里,你可以search,并修剪:

=TRIM(MID(A1,SEARCH(":",A1)+1,SEARCH("location",A1)-SEARCH(":",A1)-1))

编辑:根据您的评论:

=TRIM(MID(A1,SEARCH(":",A1)+1,SEARCH(";",SUBSTITUTE(A1," ",";",4))-SEARCH(":",A1)))

如果将所有空格展开为原始文本长度的重复空格,则可以select要parsing的原文的哪一部分。

 =TRIM(MID(SUBSTITUTE(A2, CHAR(32), REPT(CHAR(32), LEN(A2))), (B2-1)*LEN(A2)+1, C2*LEN(A2))) 

在这里输入图像说明