【问题标题】:Complicated text extract复杂的文本提取
【发布时间】:2017-09-29 02:54:31
【问题描述】:

我在单元格 A1 中有这段文字:

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

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

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

  • 1st =FIND(":",A1) -- 位置 9
  • 2nd =FIND(":",A1,FIND(":",A1)+1) -- 位置 33

但是,我不知道如何倒数第二个冒号左边的两个空格才能在 MID 中使用它。

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

【问题讨论】:

  • 你能再发一些输入和输出的例子吗?据我所知,您可能还拥有Age risk: high Address number: 123 并且想要high。从Word word: very very high indeed Word Word: word word word,你想要very very high indeed,等等??

标签: excel find extract


【解决方案1】:

您可以使用复杂的公式来完成,但使用 UDF 和正则表达式要简单得多。下面的UDF

  • 删除所有内容,包括第一个冒号之后的所有空格
  • 然后它会捕获之后的所有内容,直到通过向前看,它可以获得一系列
  • 然后它会删除该点之后的所有内容。

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

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

编辑正则表达式模式的解释以及进一步解释的链接:

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

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

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

$1

使用RegexBuddy创建

【讨论】:

  • 我在想 UDF 可能会更好,因为我正在努力寻找公式解决方案,但它很快就变得非常毛茸茸......Mid() 有一些 Substitute()Len() 和 @ 987654371@ ...
  • 这似乎有效。你能帮忙翻译一下这个模式吗?
  • @acsql 我已经添加了正则表达式模式的正式解释,并附有更多详细信息的链接。如果您对此方法还有任何疑问,请询问。
【解决方案2】:

假设你也总是在那里有“位置”,你可以搜索它,然后把它删掉:

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

编辑:根据您的评论:

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

【讨论】:

  • 谢谢,但“位置”并不总是能找到。它总是一个 2 个单词的短语,但单词本身无法预测,这就是为什么我认为使用第二个冒号左侧的第二个空格是唯一的选择。
  • @acsql - 查看我的编辑。那会奏效吗?或者你可能有多个单词?我假设在第四个空格之后,你想把它剪掉。编辑:嗯,给我一秒钟。如另一个答案中所述,您可能有“年龄风险:高”,在这种情况下这将不起作用。
  • @BruceWayne 我不知道是否相关,但是如果要返回两个以上的单词,您的公式只会返回前两个单词。
【解决方案3】:

如果您将所有空格扩展为与原始长度相同的重复空格,您可以选择要解析出原始文本的哪个部分。

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

【讨论】:

  • 哇!所以,有了这个,我认为 OP 想要:=TRIM(MID(SUBSTITUTE(A2, CHAR(32), REPT(CHAR(32), LEN(A2))), (B2-1)*LEN(A2)+1, C2*LEN(A2)))。我一直坐在这里做很多心理体操,试图用一个公式来解决这个问题。干得好吉普!
  • TBPH @BruceWayne,尽管多次阅读和重读这个问题,但我不清楚 究竟 OP 想要完成什么,所以我制定了我的回应以适应各种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多