そのようなシーケンスで終わらないような文字列に一致する正規表現パターンが必要です。つまり
\.[A-z0-9]{2,}
、検査される文字列の最後にドットのシーケンスと2つ以上の英数字が含まれていてはなりません。たとえば、文字列
は目的のパターンと一致する必要があり、一致し
/home/patryk/www
ない
必要があります。これは見回し(先読み)と関係があると思いますが、それでもどうやって作るのかわかりません。助けていただければ幸いです。/home/patryk/www/
/home/patryk/images/DSC002.jpg
4 に答える
古い答え
正規表現フレーバーがサポートしている場合は、最後にネガティブルックビハインドを使用できます。
^.*+(?<!\.\w{2,})$
これは、不要なシーケンスが前に付いていないエンドアンカーを持つ文字列と一致します。
m.buettnerが指摘しているように、これは.NETに固有の機能である無期限のルックビハインドを使用することに注意してください。
新しい答え
ただし、少し調べてみると、可変長の先読みがかなり広くサポートされていることがわかったので、これらを使用するバージョンを次に示します。
^(?:(?!\.\w{2,}$).)++$
回答へのコメントで、文字列を最後にスラッシュと一致させたくないと述べました。これは、先読みにスラッシュを追加するだけで実現できます。
^(?:(?!(\.\w{2,}|/)$).)++$
\w
簡潔にするために使用していることに注意してください。ただし、アンダースコアを使用できます。これが重要な場合は、に置き換えることができます[^\W_]
。
Asadのバージョンは非常に便利ですが、.NETの正規表現エンジンのみが可変長のルックビハインドをサポートしています(これは、すべての正規表現の質問に使用する言語またはツールを含める必要がある多くの理由の1つです)。
一致する可能性のあるケースを考えれば、これを固定長のルックビハインド(JavaScrpitを除くほとんどのエンジンでサポートされています)に減らすことができます。これは、最後に1つまたは0つの文字/数字(前にあるかどうかに関係.
なく)、または前にドットがない2つ以上の文字/数字になります。
^.*(?:(?<![a-zA-Z0-9])[a-zA-Z0-9]?|(?<![a-zA-Z0-9.])[a-zA-Z0-9]{2,})$
これはそれを行う必要があります:
^(?:[^.]+|\.(?![A-Za-z0-9]{2,}$))+$
ドット以外の 1 つ以上の一致、または 2 つ以上の英数字と文字列の末尾が続いていない場合はドットを交互に照合します。
編集:新しい要件を満たすためにアップグレードすることは、まったく同じです:
^(?:[^./]+|/(?=.)|\.(?![A-Za-z0-9]{2,}$))+$
それを分解すると、次のようになります。
[^./]+
# or 以外の任意の文字の 1 つ.
以上/
/(?=.)
# スラッシュ、少なくとも 1 文字が続く限り\.(?![A-Za-z0-9]{2,}$)
# 2 つ以上の英数字が続き、その後に文字列の末尾が続く場合を除き、ドット
別の注記:[A-z]
はエラーです。 すべての大文字と小文字の ASCII 文字に一致しますが、コード ポイントがたまたま と の間にある , , , , バックスラッシュとバックティックにも[
一致]
し^
ます。_
Z
a
可変長の後読みはめったにサポートされませんが、必要ありません:
^.*(?<!\.[A-z0-9][A-z0-9]?)$