复杂的文本提取
我在单元格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的次数,按需扩展(懒惰)
*?
- 在零和无限次之间,尽可能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)))