如何提取两个点之间的文本
Posted
技术标签:
【中文标题】如何提取两个点之间的文本【英文标题】:How to extract text between two dots 【发布时间】:2020-12-08 13:09:09 【问题描述】:你好,谁能告诉我。
示例:goldintre.cr.usgs.gov.
我想要从第一个点到最后一个点的所有文本(开头和结尾都没有点)
这必须在不从源文本中删除最后一个点的情况下完成。
谢谢
【问题讨论】:
嗨,欢迎来到 SO。你想要cr.usgs
作为输出吗?或cr.usgs.gov
?
我认为 op 想用.
作为分隔符分割字符串
【参考方案1】:
警告:以下所有可能的答案都假设您的值中至少有 两个 点!如果不是这种情况,您需要在 LibreCalc 将显示为空的 Excel 中包含和 IFERROR()
。
LibreCalc
B1
中的公式:
=REGEX(A1;"(?:^[^.]*\.|\.[^.]*$)";"";"g")
对模式的一点解释:
(?:
- 打开非捕获组。
^[^.]*\.
- 开始字符串 ancor,后跟零个或多个字符而不是文字点,然后是一个点。
|
- 或者。
\.[^.]*$
- 文字点,后跟零个或多个字符,而不是文字点,后跟结束字符串 ancor。
)
- 关闭非捕获组。
根据this在线演示,您可以看出替换现在将“删除”标记的文本。
请注意,分号是 LibreCalc 中的标准分隔符(并且经常被作为 Excel 标准分隔符的逗号混淆)。
Excel 2019/O365
B1
中的公式:
=TEXTJOIN(".",,FILTERXML("<t><s>"&SUBSTITUTE(A1,".","</s><s>")&"</s></t>","//s[position()>1][position()<last()]"))
虽然当您拥有 Excel O365 时,它是 LET()
的一个更长的替代方案,但它也适用于 Excel 2019,并使用 TEXTJOIN()
和一些 XPATH
表达式,这意味着:
//s
- 返回所有“s”节点。
[position()>1]
- 节点的位置大于第一个索引并且:
[position()<last()]
- 节点位置小于最后一个索引。
有关该构造的更多信息,我认为您可以查看this。以前的帖子。
请注意,您也可以在 LibreCalc
中使用它,但您需要使用修改后的安装,因为默认功能 FILTERXML()
有一个错误。
一般的 Excel:
对于较旧的 Excel 版本,您可以使用:
=MID(A1,FIND(".",A1)+1,FIND("|",SUBSTITUTE(A1,".","|",LEN(A1)-LEN(SUBSTITUTE(A1,".",""))))-FIND(".",A1)-1)
基本上,我们首先确定字符串中有多少个点,然后SUBSTITUTE()
管道符号中的最后一个点(或任何唯一字符),然后才能FIND()
它的位置。如果我们确定第一个点的位置,那么当我们在MID()
中提供起始和长度参数时,计算就很简单了。
编辑
从 OP 的结尾得到更好的解释后,他的字符串值似乎总是以点结尾。在这种情况下,您可以简单地 REPLACE()
字符串的第一部分:
=REPLACE(LEFT(A1,LEN(A1)-1),1,FIND(".",A1),"")
这也将使在 LibreCalc 中的工作变得更容易:
=REGEX(A1;"^[^.]*\.(.*).$";"$1";"g")
【讨论】:
哦!我刚刚注意到你提出了一个类似的建议。赞成。【参考方案2】:您没有为您的数据提供足够的详细信息以及所需的输出。那么让我们考虑所有的可能性。
Case-1 你总是有一个.
,并且你想要在第一个点和最后一个点之间的文本。使用这个公式 -
=MID(A1, SEARCH(".", A1)+1, LEN(A1)-SEARCH(".", A1)-1)
这会给你cr.usgs.gov
作为输出。
案例 2 您无需考虑最后一个点并删除该点之前的文本(再次假设最后一个点位于最后一个位置)
=MID(A1,SEARCH(".",A1)+1, SEARCH("$",SUBSTITUTE(A1,".", "$", LEN(A1)-LEN(SUBSTITUTE(A1, ".", ""))-1))-SEARCH(".",A1)-1)
这将为您提供cr.usgs
作为输出(还假设$
在您的任何文本字符串中都不存在。
其他情况当您在所有最后的地方都没有点时。为此,您必须稍微调整一下公式。
=MID(A1,SEARCH(".",A1)+1, SEARCH("$",SUBSTITUTE(A1,".", "$", LEN(A1)-LEN(SUBSTITUTE(A1, ".", ""))))-SEARCH(".",A1)-1)
如果您的输入 (A1) 是 ab.cd.ef.ghi
,这将为您提供输出 cd.ef
。在 case-2 公式中,我刚刚删除了额外的 -1
,它用于从文本字符串中排除最后一个点。
注意此公式适用于所有版本的 excel。
【讨论】:
感谢您提供的公式有效。我很抱歉没有提供足够的信息。案例 1 是我正在寻找的答案。 :D 对,所以这比最初想象的要简单得多 =)。好答案 AnilGoyal,赞成。为了您的兴趣,我还提供了一些更短的解决方案,可以避免重复搜索@KarloHorvat。 是的,如果最后有一个点,解决方案会更容易。 @KarloHorvat,我认为所有答案都应该得到您的支持,因为所有答案都是正确的。【参考方案3】:如果您有 Excel 365,那么对于单元格 A1 中的数据,请使用:
=LET(x,FIND(".",A1)+1,y,LEN(A1),MID(A1,x,y-x))
(假设末尾总是有一个点)
【讨论】:
我越来越喜欢 O365 中的LET()
函数。
请注意您的公式并不能很好地工作,它目前确实不删除最后一个点(以及最后一个点之后的潜在字符,例如:goldintre.cr.usgs.gov.test
产生@987654326 @)。不过这个想法很好 =)
@JvdV 你是对的!该公式假定末尾有一个 .。以上是关于如何提取两个点之间的文本的主要内容,如果未能解决你的问题,请参考以下文章