【问题标题】:Regex for validating URL with brackets in Swift用于在 Swift 中使用括号验证 URL 的正则表达式
【发布时间】:2021-09-02 16:14:45
【问题描述】:

在我的应用程序中,我需要验证用户输入到 textField 中的 URL。有效 URL 的末尾可能带有带数字的括号,例如“https://stackoverflow.com(24)”。不带括号的 URL,例如“https://stackoverflow.com”,也是有效的。

我使用此代码来验证不带括号的 URL,它有效:

extension String {
    
    func validateUrl() -> Bool {
        let urlRegEx =
            "^(http|https|ftp)\\://([a-zA-Z0-9\\.\\-]+(\\:[a-zA-Z0-9\\.&%\\$\\-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|localhost|([a-zA-Z0-9\\-]+\\.)*[a-zA-Z0-9\\-]+\\.(com|ru|kz|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(\\:[0-9]+)*(/($|[a-zA-Z0-9\\.\\,\\?\\'\\\\\\+&%\\$#\\=~_\\-]+))*$"
        return NSPredicate(format: "SELF MATCHES %@", urlRegEx).evaluate(with: self)
    }
    
}

但是,它不会验证带括号的 URL。我应该在这个正则表达式的末尾结束什么以使其适用于两种类型的 URL?任何帮助表示赞赏!

【问题讨论】:

  • 验证URL是什么意思?你不能试着用你的字符串初始化一个URL 吗?如果返回 nil 则无效。
  • 你可以在最后加上(\(\d+\))?,有什么我遗漏的吗?
  • 多么巨大的正则表达式模式????也许只是return URL(string: self) != nil 就足够了。如果 URL 无效,init 方法返回 nil
  • 你到底想用你庞大的正则表达式模式验证什么?

标签: ios swift regex


【解决方案1】:

您可以在$之前添加(?:\(\d+\))?

"^(http|https|ftp)://([a-zA-Z0-9.-]+(?::[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[0-9])|localhost|([a-zA-Z0-9-]+\\.)*[a-zA-Z0-9-]+\\.(com|ru|kz|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(?::[0-9]+)*(/($|[a-zA-Z0-9.,?'\\\\+&%$#=~_-]+))*(?:\\(\\d+\\))?$"

(?:\(\d+\))? 匹配可选出现的 ( 序列,一个或多个数字 )

注意:

  • {1} 在正则表达式中总是多余的,删除这些
  • 你不需要转义很多特殊的字符 inside 方括号,如.;$ 等。只有[]^-]\ 在方括号内是特殊的
  • 字符类末尾的-[...] 事物)不必转义
  • 我用非捕获替换了一些捕获组,因为您没有提取部分匹配项。

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2011-06-17
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2014-10-19
    相关资源
    最近更新 更多