繁体   English   中英

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

[英]Validate proxy URL using XML regex pattern

我正在使用XML regex模式来匹配我的代理URL。

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

我的要求:

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

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

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

任何帮助将不胜感激。 提前致谢 !

正如@arnep所指出的那样,您正在尝试使用带交替符号的否定字符类 ,但这不是它的工作方式。 另外,这里是有关前行的一些信息。

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

更新:

我没有意识到您使用的引擎不支持负面环视。 没有负面的环顾,几乎不可能实现您想要的目标。

几乎 ;)

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

(?:[^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]

这是一个正在运行的示例: 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. 如果第一个字符 “ h”,则:
    1. 如果第二个字符不是“ t”,那就太好了! (字符串不能为“ http://”或“ https://”。)
    2. 如果第二个字符 “ t”,则:
      1. ...不是“ t”,太好了!
      2. ... “ t”,则:
        1. ...不是“ p”,太好了!
        2. ... “ p”,则:

在这里,这很棘手:现在我们遇到了三个分支。

  1. 如果第五个字符不是“ s”也不是“:”,那就太好了!
  2. 如果第五个字符 “ s”,则:
    1. 如果第六个字符不是“:”,那就太好了!
    2. 如果第六个字符 “:”,则:
      1. 如果第七个字符不是“ /”,那就太好了!
      2. 如果第七个字符 “ /”,则:
        1. 如果第八个字符不是“ /”,那就太好了!
        2. 否则,失败! 我们找到了一个“ https://”。
  3. 如果第五个字符 “:”,则:
    1. 如果第六个字符不是“ /”,那就太好了!
    2. 如果第六个字符 “ /”,则:
      1. 如果第七个字符不是“ /”,那就太好了!
      2. 否则,失败! 我们找到了一个“ http://”。

最后,如果到此为止,我们将寻找一串非空白字符,后跟一个冒号,然后是一串数字。

我将它留给比我本人更聪明的数学家来考虑,是否可以通过这种方式将所有使用环视条件可匹配的字符串“强加给”。

为避免匹配以某个单词开头的字符串,请使用负向查找:

^(?!https?).*$

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM