簡體   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