我使用 XML正则表达式来匹配我的代理网址。
例如:代理:ab-proxy-sample.company.com:8080
我的要求:
我目前的XML正则表达式为:[^ http:// | https://]。+:[0-9] + |
但它匹配每个字母而不是整个字?
任何帮助都将受到高度赞赏。 提前谢谢!
答案 0 :(得分:1)
正如@arnep指出的那样,您正在尝试将a negated character class与alternation一起使用,这不是它的工作方式。此外,这里有一些关于lookaheads的信息。
我确定其他人会发布您可以复制和粘贴的答案,但这是学习正则表达式基础知识的有用机会!
<强>更新强>
我没有意识到您使用的是不支持负面外观的引擎。没有消极的外表,实现你想做的事几乎是不可能的。
几乎;)
这是一种“强力”组合方法:
(?:[^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+
解释:
在这里,它变得棘手:现在我们遇到三个分支。
最后,如果我们到目前为止,那么我们会查找一串非空白字符,后跟一个冒号,后跟一串数字。
我把它交给比我更聪明的数学家来思考是否所有使用外观匹配的字符串都可以用这种方式“暴力强迫”。
答案 1 :(得分:0)
为避免匹配以某个单词开头的字符串,请使用否定前瞻:
^(?!https?).*$
将匹配任何不以http开头的字符串。其他要求留给读者作为练习: - )