@arnep が指摘しているように、否定された文字クラスをalternationで使用しようとしていますが、これは機能する方法ではありません。また、先読みに関する情報もあります。
他の誰かがコピーして貼り付けることができる回答を投稿すると確信していますが、これは正規表現の基本を学ぶ絶好の機会です!
アップデート:
否定的なルックアラウンドをサポートしていないエンジンを使用しているとは知りませんでした。否定的な回避策がなければ、やろうとしていることを達成することはほぼ不可能です。
ほぼ;)
これを行う「ブルートフォース」の組み合わせ方法を次に示します。
(?:[^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 エンジンが and のような文字クラスをサポートしていない場合は、代わりに\S
and\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+
説明:
- 最初の文字が「h」でない場合は、問題ありません。(文字列が「http://」または「https://」であってはなりません。)
- ただし、最初の文字が「h」の場合:
- 2 番目の文字が「t」でない場合は、問題ありません。(文字列が「http://」または「https://」であってはなりません。)
- ただし、 2 番目の文字が「t」の場合:
- ...「t」じゃないですよね!
- ...は"t" の場合:
- ...「p」ではありません。
- ...は"p" の場合:
ここで、ややこしくなります。ここで、 3 つの分岐に遭遇します。
- 5 番目の文字が「s」でも「:」でもない場合は、問題ありません。
- ただし、 5 番目の文字が「s」の場合:
- 6 番目の文字が「:」でない場合は、問題ありません。
- ただし、 6 番目の文字が「:」の場合は、次のようになります。
- 7 番目の文字が「/」でない場合は、問題ありません。
- ただし、 7 番目の文字が「/」の場合は、次のようになります。
- 8 番目の文字が「/」でない場合は、問題ありません。
- そうでなければ、失敗してください!「https://」が見つかりました。
- ただし、 5 番目の文字が「:」の場合は、次のようになります。
- 6 番目の文字が「/」でない場合は、問題ありません。
- ただし、 6 番目の文字が「/」の場合は、次のようになります。
- 7 番目の文字が「/」でない場合は、問題ありません。
- そうでなければ、失敗してください!「http://」が見つかりました。
最後に、ここまでたどり着いたら、空白以外の文字列、コロン、数字の列を探します。
ルックアラウンドを使用して一致するすべての文字列がそのような方法で「ブルートフォース」できるかどうかを熟考するのは、私よりも賢い数学者に任せます。