Regex-专门用于Excel VBA的URL Regex

Regex-专门用于Excel VBA的URL Regex,regex,excel,vba,Regex,Excel,Vba,我试图想出我自己的url正则表达式的变体,以便在vba中使用 这就是我目前拥有的: ((https?\:\/\/)?([^\s\.\-]{1,}(?:(?:\.|\-)[^\s\.\-]{1,}){0,})(?=\.(?:[^\s]{1,}){0,2}\/|$)(\.ac|\.ad|\.ae|\.af|\.ag|\.ai|\.al|\.am|\.ao|\.aq|\.ar|\.as|\.at|\.au|\.aw|\.ax|\.az|\.ba|\.bb|\.bd|\.be|\.bf|\.bg|\.b

我试图想出我自己的url正则表达式的变体,以便在vba中使用

这就是我目前拥有的:

((https?\:\/\/)?([^\s\.\-]{1,}(?:(?:\.|\-)[^\s\.\-]{1,}){0,})(?=\.(?:[^\s]{1,}){0,2}\/|$)(\.ac|\.ad|\.ae|\.af|\.ag|\.ai|\.al|\.am|\.ao|\.aq|\.ar|\.as|\.at|\.au|\.aw|\.ax|\.az|\.ba|\.bb|\.bd|\.be|\.bf|\.bg|\.bh|\.bi|\.bj|\.bm|\.bn|\.bo|\.br|\.bs|\.bt|\.bw|\.by|\.bz|\.ca|\.cc|\.cd|\.cf|\.cg|\.ch|\.ci|\.ck|\.cl|\.cm|\.cn|\.co|\.cr|\.cu|\.cv|\.cw|\.cx|\.cy|\.cz|\.de|\.dj|\.dk|\.dm|\.do|\.dz|\.ec|\.ee|\.eg|\.es|\.et|\.eu|\.fi|\.fj|\.fk|\.fm|\.fo|\.fr|\.ga|\.gd|\.ge|\.gf|\.gg|\.gh|\.gi|\.gl|\.gm|\.gn|\.gp|\.gq|\.gr|\.gs|\.gt|\.gu|\.gw|\.gy|\.hk|\.hm|\.hn|\.hr|\.ht|\.hu|\.id|\.ie|\.il|\.im|\.in|\.io|\.iq|\.ir|\.is|\.it|\.je|\.jm|\.jo|\.jp|\.ke|\.kg|\.kh|\.ki|\.km|\.kn|\.kp|\.kr|\.kw|\.ky|\.kz|\.la|\.lb|\.lc|\.li|\.lk|\.lr|\.ls|\.lt|\.lu|\.lv|\.ly|\.ma|\.mc|\.md|\.me|\.mg|\.mh|\.mk|\.ml|\.mm|\.mn|\.mo|\.mp|\.mq|\.mr|\.ms|\.mt|\.mu|\.mv|\.mw|\.mx|\.my|\.mz|\.na|\.nc|\.ne|\.nf|\.ng|\.ni|\.nl|\.no|\.np|\.nr|\.nu|\.nz|\.om|\.pa|\.pe|\.pf|\.pg|\.ph|\.pk|\.pl|\.pm|\.pn|\.pr|\.ps|\.pt|\.pw|\.py|\.qa|\.re|\.ro|\.rs|\.ru|\.rw|\.sa|\.sb|\.sc|\.sd|\.se|\.sg|\.sh|\.si|\.sk|\.sl|\.sm|\.sn|\.so|\.sr|\.ss|\.st|\.su|\.sv|\.sx|\.sy|\.sz|\.tc|\.td|\.tf|\.tg|\.th|\.tj|\.tk|\.tl|\.tm|\.tn|\.to|\.tr|\.tt|\.tv|\.tw|\.tz|\.ua|\.ug|\.uk|\.us|\.uy|\.uz|\.va|\.vc|\.ve|\.vg|\.vi|\.vn|\.vu|\.wf|\.ws|\.ye|\.yt|\.za|\.zm|\.zw)(\/[^\s]{0,})?)
目前,我正在尝试匹配特定的域名,因为我想排除移动应用程序名称(例如com.king.candycrusosodasaga不应包括在内) 但是,如果我可以使用更通用的正则表达式来实现这一目标,那将是非常好的,因为手动放置所有这些域结尾不是非常有效/高效

如果有更好的方法,请告诉我

谢谢你的帮助

其他信息: 我正在尝试将其用于excel,在excel中,我可以将一组URL,包括移动应用程序(如com.king.candycrusosodasaga)放入一个表中,并在不同的列中匹配实际网站,以排除移动应用程序等非网站

这是该表的外观:

=IF(IsMatch([@Url];RegularExps[URL Regex 1]);"Website";"Other")

更多背景信息:

我已经有了一个vba函数,可以用作公式。 它有两个参数,一个是url所在的单元格/区域,另一个是regex所在的区域。 出于某种原因,长字符串会抛出“#value”,因此我不得不拆分一些正则表达式

这就是公式的样子:

=IF(IsMatch([@Url];RegularExps[URL Regex 1]);"Website";"Other")
我已经在这篇文章中尝试使用regex'es(或者regexi,不管regex的复数形式是什么):


但是我没有成功地使用任何一个,因为它们要么包含应用程序域,要么抛出#值,要么排除有效的URL

我知道你在询问regex,但我不确定它是否对用户友好。下面是一个具有查找表的示例:

B2
中的公式:

=IF(COUNTIF($E$2:INDEX(E:E,COUNTA(E:E)),MID(A2,SEARCH("=",SUBSTITUTE(A2,".","=",LEN(A2)-LEN(SUBSTITUTE(A2,".",""))))+1,256))>0,"Website","Other")

我只是将
.com
添加到列表中。如果愿意,可以添加到列表中,范围是动态的。当然,你也可以把它做成一张表,并引用它

如果你选择使用VBA,我不知道正则表达式的附加值是多少。还有其他的方法,但事实上REGEX就是其中之一。例如,您可以使用:

Function WEBSITE(RNG As Range) As String

Select Case Evaluate("Trim(Right(Substitute(" & RNG.Address & ", ""."", Rept("" "", Len(" & RNG.Address & "))), Len(" & RNG.Address & ")))")
Case "ac", "ad", "ae", "af", "ag", "ai", "al", "am", "ao", "aq", "ar", _
    "as", "at", "au", "aw", "ax", "az", "ba", "bb", "bd", "be", "bf", "bg", _
    "bh", "bi", "bj", "bm", "bn", "bo", "br", "bs", "bt", "bw", "by", "bz", _
    "ca", "cc", "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", _
    "cr", "cu", "cv", "cw", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", _
    "dz", "ec", "ee", "eg", "es", "et", "eu", "fi", "fj", "fk", "fm", "fo", _
    "fr", "ga", "gd", "ge", "gf", "gg", "gh", "gi", "gl", "gm", "gn", "gp", _
    "gq", "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", _
    "hu", "id", "ie", "il", "im", "in", "io", "iq", "ir", "is", "it", "je", _
    "jm", "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", _
    "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", "lv", _
    "ly", "ma", "mc", "md", "me", "mg", "mh", "mk", "ml", "mm", "mn", "mo", _
    "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", "my", "mz", "na", _
    "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", "nr", "nu", "nz", "om", _
    "pa", "pe", "pf", "sl", "sm", "sn", "so", "sr", "ss", "st", "su", "sv", _
    "sx", "sy", "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", _
    "tn", "to", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "uk", "us", "uy", _
    "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wf", "ws", "ye", "yt", _
    "za", "zm", "zw", "com"

    WEBSITE = "Website"
Case Else
    WEBSITE = "Other"
End Select

End Function
比如:

=WEBSITE(A2)

只需将
\.com
添加到
(…|\.com…
)之前的巨大备选
\.com
,因为它将成功地匹配省略
m
,而不检查
com

,您还可以使用带有域结尾的查找表检查是否符合您的要求。在这成为公认的答案之前,我会等待,看看是否还有其他人有更好的解决方案。有趣的是,我也在研究一个基于公式的解决方案,但我认为使用正则表达式将是解决这个问题的更精确的方法problem@Alan,谢谢,我还更新了一点答案,向大家展示了如何在没有REGEXok的情况下做到这一点。谢谢,这对现在很有帮助。我更新了这个问题,因为我觉得我目前的解决方案无效