我使用的XML正则表达式匹配我的代理URL。
如:代理:ab-proxy-sample.company.com:8080
我的要求:
- 不应该以http://或https://(匹配整个字)
- 应该接受任何字符串+端口
- 应该接受甚至字符串开头HT
我现在的XML正则表达式是:[^ HTTP:// | https://开头] +:[0-9] + |
但其匹配的每一个字母,而不是整个单词?
任何帮助将高度赞赏。 提前致谢 !
我使用的XML正则表达式匹配我的代理URL。
如:代理:ab-proxy-sample.company.com:8080
我的要求:
我现在的XML正则表达式是:[^ HTTP:// | https://开头] +:[0-9] + |
但其匹配的每一个字母,而不是整个单词?
任何帮助将高度赞赏。 提前致谢 !
作为@arnep指出,你试图使用一个否定的字符类与交替 ,这不是它的工作方式。 此外,这里是对于一些信息向前看符号 。
我敢肯定,别人会发布一个答案,你可以复制和粘贴,但这是学习正则表达式的基础知识很好的机会!
更新:
我不知道,你正在使用不支持负lookarounds发动机。 如果没有负面lookarounds,这几乎是不可能实现你想要做什么。
近 ;)
这里是一个“蛮力”做这件事的组合学方法:
(?:[^h]|h(?:[^t]|t(?:[^t]|t(?:[^p]|p(?:[^s:]|s(?:[^:]|:(?:[^\/]|\/(?:[^\/])))|:(?:[^\/]|\/(?:[^\/])))))))\S+:\d+
如果XML引擎不支持非捕获组,即(?: ... )
然后使用普通组,而不是:
([^h]|h([^t]|t([^t]|t([^p]|p([^s:]|s([^:]|:([^\/]|\/([^\/])))|:([^\/]|\/([^\/])))))))\S+:\d+
如果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+
说明:
在这里,它变得棘手:现在我们遇到的三个分支。
最后,如果我们已经远远获得这样的,那么我们寻找的非空白字符的字符串,后跟一个冒号,然后是一串数字。
我让一个聪明的数学家比自己去思考所有字符串是否使用lookarounds可以为匹配“野蛮强迫”以这样的方式。
为了避免匹配开始与一些词串,提前使用负的样子:
^(?!https?).*$
将匹配不以HTTP(S)开始的任何字符串。 其他的要求是留给读者作为一个练习:-)