1

XML 正規表現パターンを使用して、プロキシ URL を照合しています。

例: プロキシ: ab-proxy-sample.company.com:8080

私の要件:

  1. http ://またはhttps: //で始めないでください(単語全体に一致)
  2. 任意の文字列 + ポートを受け入れる必要があります
  3. htで始まる偶数文字列を受け入れる必要があります

私の現在の XML 正規表現は [^http://|https://].+:[0-9]+| です。

しかし、単語全体ではなく、各文字に一致しますか?

どんな助けでも大歓迎です。前もって感謝します !

4

2 に答える 2

1

@arnep が指摘しているように、否定された文字クラスalternationで使用しようとしていますが、これは機能する方法ではありません。また、先読みに関する情報もあります。

他の誰かがコピーして貼り付けることができる回答を投稿すると確信していますが、これは正規表現の基本を学ぶ絶好の機会です!

アップデート:

否定的なルックアラウンドをサポートしていないエンジンを使用しているとは知りませんでした。否定的な回避策がなければ、やろうとしていることを達成することはほぼ不可能です。

ほぼ;)

これを行う「ブルートフォース」の組み合わせ方法を次に示します。

(?:[^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 エンジンが and のような文字クラスをサポートしていない場合は、代わりに\Sand\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. 2 番目の文字が「t」でない場合は、問題ありません。(文字列が「http://」または「https://」であってはなりません。)
    2. ただし、 2 番目の文字「t」の場合:
      1. ...「t」じゃないですよね!
      2. ..."t" の場合:
        1. ...「p」ではありません。
        2. ..."p" の場合:

ここで、ややこしくなります。ここで、 3 つの分岐に遭遇します。

  1. 5 番目の文字が「s」でも「:」でもない場合は、問題ありません。
  2. ただし、 5 番目の文字「s」の場合:
    1. 6 番目の文字が「:」でない場合は、問題ありません。
    2. ただし、 6 番目の文字「:」の場合は、次のようになります。
      1. 7 番目の文字が「/」でない場合は、問題ありません。
      2. ただし、 7 番目の文字「/」の場合は、次のようになります。
        1. 8 番目の文字が「/」でない場合は、問題ありません。
        2. そうでなければ、失敗してください!「https://」が見つかりました。
  3. ただし、 5 番目の文字「:」の場合は、次のようになります。
    1. 6 番目の文字が「/」でない場合は、問題ありません。
    2. ただし、 6 番目の文字「/」の場合は、次のようになります。
      1. 7 番目の文字が「/」でない場合は、問題ありません。
      2. そうでなければ、失敗してください!「http://」が見つかりました。

最後に、ここまでたどり着いたら、空白以外の文字列、コロン、数字の列を探します。

ルックアラウンドを使用して一致するすべての文字列がそのような方法で「ブルートフォース」できるかどうかを熟考するのは、私よりも賢い数学者に任せます。

于 2012-06-22T14:34:36.640 に答える
0

ある単語で始まる文字列との一致を避けるには、否定先読みを使用します。

^(?!https?).*$

http(s) で始まらないすべての文字列に一致します。他の要件は、演習として読者に任せます:-)

于 2012-06-25T08:34:24.230 に答える