从各种输入的网址

时间:2017-09-09 05:18:12

标签: regex excel-formula

客户提供许多不同类型格式的网址。我寻找一个可以提取主机名的Excel公式(包括www,如果提供的话),其他一切都需要修剪掉。以下是我们收到的网址示例,粗体文字是我希望在下一个相邻单元格中提取的部分。单细胞公式是理想的(RIGHT,LEFT,REGEXMATCH等),但我没有成功匹配以下所有变体,寻求社区寻求帮助: - )

  

的http:// testing.com.my /学院/ openday /?   utm_campaign =癸&安培; utm_source =搜索和安培; utm_medium = CPC&安培;的utm_content =链路

     

的http:// testing.com utm_source =测试

     

的http:// testing.com / utm_source =测试

     

的http:// www.testing.com.sg /测试utm_source =测试

     

的https:// www.testing.com / asdsd utm_source =测试

     

的http:// www.testing.edu.my /学院/ openday / utm_campaign =癸&安培; utm_source =搜索和安培; utm_medium = CPC&安培;的utm_content =链路

     

testing.edu.my

     

testing.com

     

testing.com /?asdomasd

     

www.testing.com

     

www.testing.com.my ?测试

     

www.testing.com.my /?测试

     

www.testing.edu.my / openday / utm_campaign =癸&安培; utm_source =搜索和安培; utm_medium = CPC&安培;的utm_content =链路

     

www.testing.edu.my /学院/ openday /

     

// www.testing.com /测试

     

// testing.com / DDSD?utm_source =测试

2 个答案:

答案 0 :(得分:0)

请注意,您正在寻找的正则表达式并不常见,因为您接受匹配可能直接从//开始的网址。

因此,在Excel公式中,使用以下正则表达式^(https?:)?(\/\/)?([^\/]*).*并在正则表达式匹配时访问第3个匹配组。

请注意,这将为您提供主机名或IP地址(对于IPv6地址,您将获得[theIPv6Address]以及地址周围的插入符号。)

答案 1 :(得分:0)

很抱歉,我找不到更短的一个但是你去了:

=MID(A2,FIND(MID(E2,IFERROR(FIND("|",SUBSTITUTE(LEFT(A2,FIND(".",A2)-1),"/","|",LEN(LEFT(A2,FIND(".",A2)-1))-LEN(SUBSTITUTE(LEFT(A2,FIND(".",A2)-1),"/","")))),0)+1,30),A2),FIND(MID(MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10),1,IFERROR(IFERROR(FIND("/",MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10)),FIND("?",MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10))),LEN(MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10))+1)-1),A2)+LEN(MID(MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10),1,IFERROR(IFERROR(FIND("/",MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10)),FIND("?",MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10))),LEN(MID(A2,FIND("|",SUBSTITUTE(A2,".","|",LEN(A2)-LEN(SUBSTITUTE(A2,".","")))),10))+1)-1))-FIND(MID(E2,IFERROR(FIND("|",SUBSTITUTE(LEFT(A2,FIND(".",A2)-1),"/","|",LEN(LEFT(A2,FIND(".",A2)-1))-LEN(SUBSTITUTE(LEFT(A2,FIND(".",A2)-1),"/","")))),0)+1,30),A2))

这有点难以解释,所以我也上传了逻辑方法。

enter image description here

首先,我想找到first .,然后删除前缀,然后找到第一个好措辞的位置。请参阅我以绿色突出显示的列。

其次,我想找到last .。但这有点棘手。您不知道它将如何结束,所以我添加了10个字符(您可以更改为更大的值)。然后我找到/?(从您的示例中,我相信/总是先行)或包括所有单词,如果这两个字符不存在。然后我可以检索最后一个好的字符串并找到位置。这些都是在那些黄色列中完成的。

最后,在蓝色栏目中。我简单地将所有公式合并到一个单元格中,以显示起点和终点。顺便说一句,您还可以在row 18中看到相关的公式。

我从这个练习中学到了一些技巧:

  • LEN(A2)-LEN(SUBSTITUTE(A2,"/",""))可帮助您查找字符串中有多少/(替换此字符以找到您想要的字符)。

  • =SUBSTITUTE(A2,"/","|",LEN(A2)-LEN(SUBSTITUTE(A2,"/","")))可以找到该字符串中的最后一个/(替换此字符以找到您想要的那个)字符。请注意我在这里使用|只是因为这个角色很少见,但你可以使用你认为它不会出现在你的字符串中的任何一个。

希望这有帮助。