使用XML正则表达式模式验证代理URL

时间:2012-06-22 14:12:19

标签: xml regex url

我使用 XML正则表达式来匹配我的代理网址。

例如:代理:ab-proxy-sample.company.com:8080

我的要求:

  1. 应该以 http:// https:// (匹配整个单词)开头
  2. 应接受任何字符串+端口
  3. 应该接受以 ht
  4. 开头的字符串

    我目前的XML正则表达式为:[^ http:// | https://]。+:[0-9] + |

    但它匹配每个字母而不是整个字?

    任何帮助都将受到高度赞赏。 提前谢谢!

2 个答案:

答案 0 :(得分:1)

正如@arnep指出的那样,您正在尝试将a negated character classalternation一起使用,这不是它的工作方式。此外,这里有一些关于lookaheads的信息。

我确定其他人会发布您可以复制和粘贴的答案,但这是学习正则表达式基础知识的有用机会!

<强>更新

我没有意识到您使用的是不支持负面外观的引擎。没有消极的外表,实现你想做的事几乎是不可能的。

几乎;)

这是一种“强力”组合方法:

(?:[^h]|h(?:[^t]|t(?:[^t]|t(?:[^p]|p(?:[^s:]|s(?:[^:]|:(?:[^\/]|\/(?:[^\/])))|:(?:[^\/]|\/(?:[^\/])))))))\S+:\d+
  1. 如果XML引擎不支持未捕获的组,即(?: ... ),则使用常规组:

    ([^h]|h([^t]|t([^t]|t([^p]|p([^s:]|s([^:]|:([^\/]|\/([^\/])))|:([^\/]|\/([^\/])))))))\S+:\d+
    
  2. 如果XML引擎不支持\S\d等字符类,请改用[^ \t\r\n\p][0-9]

  3. 以下是一个正在运行的示例:http://rubular.com/r/JnpCVgeLmL。尝试更改测试字符串。你会看到......

        ab-proxy-sample.company.com:8080          # matches
        htab-proxy-sample.company.com:8080        # matches
        http://ab-proxy-sample.company.com:8080   # doesn't
        https://ab-proxy-sample.company.com:8080  # doesn't
        httpd://ab-proxy-sample.company.com:8080  # matches
    

    请注意您不需要^$ 。我专门为Rubular演示添加了这些,但显然XML引擎假设了这种情况(锚定)。

    这是如何工作的?如果我们这样分解它会更容易理解:

        ([^h] | h
        ([^t] | t
        ([^t] | t
        ([^p] | p
        ([^s:]| s ([^:]|:([^\/]|\/([^\/])))
              | :        ([^\/]|\/([^\/])))
        ))))
        \S+:\d+
    

    解释:

    1. 如果第一个字符不是“h”,那就太好了! (字符串不可能是“http://”或“https://”。)
    2. 如果第一个char 是“h”,那么:
      1. 如果第二个字符不是“t”,那就太好了! (字符串不可能是“http://”或“https://”。)
      2. 如果第二个字符 是“t”,那么:
        1. ...不是“t”,太棒了!
        2. ... “t”,然后:
          1. ...不是“p”,太棒了!
          2. ... “p”,然后:
    3. 在这里,它变得棘手:现在我们遇到三个分支。

      1. 如果第五个字母不是“s”也不是“:”,那么太棒了!
      2. 如果第五个字符 是“s”,那么:
        1. 如果第六个字符不是“:”,那就太棒了!
        2. 如果第六个字符 是“:”,那么:
          1. 如果第七个字符不是“/”,那就太棒了!
          2. 如果第七个字符 是“/”,那么:
            1. 如果第八个字符不是“/”,那就太棒了!
            2. 否则,失败!我们找到了“https://”。
      3. 如果第五个字符 是“:”,那么:
        1. 如果第六个字母不是“/”,那就太棒了!
        2. 如果第六个字符 是“/”,那么:
          1. 如果第七个字符不是“/”,那就太棒了!
          2. 否则,失败!我们找到了一个“http://”。
      4. 最后,如果我们到目前为止,那么我们会查找一串非空白字符,后跟一个冒号,后跟一串数字。

        我把它交给比我更聪明的数学家来思考是否所有使用外观匹配的字符串都可以用这种方式“暴力强迫”。

答案 1 :(得分:0)

为避免匹配以某个单词开头的字符串,请使用否定前瞻:

^(?!https?).*$

将匹配任何不以http开头的字符串。其他要求留给读者作为练习: - )