.php で終わらないファイル名に一致する非常に単純な正規表現を作成しようとしています。私は次のことを思いつきました...
(.*?)(?!\.php)$
...しかし、これはすべてのファイル名に一致します。誰かが私を正しい方向に向けることができれば、私はとても感謝しています.
.php で終わらないファイル名に一致する非常に単純な正規表現を作成しようとしています。私は次のことを思いつきました...
(.*?)(?!\.php)$
...しかし、これはすべてのファイル名に一致します。誰かが私を正しい方向に向けることができれば、私はとても感謝しています.
ほとんど:
.*(?!\.php)....$
最後の 4 つのドットは、先読みがチェックされたときに、先を見通すものがあることを確認します。
マッチ全体に関心があるため、外側の括弧は不要です。
.*?
すべてのステップで次の条件をチェックするよりも 4 つのステップをバックトラックする方が効率的であるため、消極的なものは不要です。
否定先読みを使用する代わりに、ホスト言語レベルで正規表現の外で否定を使用する方が簡単な場合があります。多くの言語では、boolean
補数演算子は単項!
です。
したがって、次のように書くことができます。
! str.hasMatch(/\.php$/)
言語によっては、正規表現を完全にスキップして、次のようなもの (Java など) を使用することもできます。
! str.endsWith(".php")
元のパターン自体の問題については、次のとおりです。
(.*?)(?!\.php)$ // original pattern, doesn't work!
これは、たとえば に一致します。はをキャプチャできるfile.php
ため、先を見据えるとに一致することはできませんが、 に一致する可能性があるため、完全に一致します! look behindを使用するか、サポートされていない場合は、文字列の先頭を先読みできます。(.*?)
file.php
\.php
$
^(?!.*\.php$).*$ // negative lookahead, works
".php"
これは、否定先読みを使用して終わらないすべての文字列に一致します。
あなたは弦の端にいて、前を見ています。あなたが望むのは、代わりに後ろを見ることです:
(.*)$(?<!\.php)
すべての正規表現エンジンが後読みアサーションをサポートしているわけではないことに注意してください。