1

私はルックアラウンド アサートについてもっと理解しようとしていますが、このスレッドを見つけました。PHP ではルック ビハインド アサートを固定長にする必要があるため、解決策は一部のエンジンでは機能するはずですが、PHP では機能しないはずです。

私が望むのは、同じシナリオを PHP で機能させるか、少なくともそれが可能かどうかを知ることです。

正規表現ルールの説明を減らしてみたので、上記のスレッドと同じではありませんが、同じ原則に従います。

3 つの部分で構成される文字列に一致する必要があります。

  • 任意の数の英数字で始まる
  • 「abc-」の後に 3 ~ 5 個の数字やハイフンが続くものを含まない
  • 「.htm」または「.html」で終わる

したがって、これらは次のように一致します。

  • xxxyz-123.html
  • xx123-abc.htm
  • xxabc123.html
  • xxabc-123-45.htm

しかし、これらは一致しません:

  • xxabc-4324.htm
  • xxabc-1-2.html
  • xxac-12-34.txt
  • xxabc-12345.htm

以下の正規表現パターンのいくつかのバリエーションを試してみましたが、うまくいきません - この特定のケースは固定長の制限のためです:

.*(?<!abc-[\d-]{3,5})\.htm[^l]?$

また、さまざまなテスト文字列を使用し、正確に、たとえば 3 つの数字および/またはハイフンのみに焦点を当てて、3 ~ 5 の範囲部分を忘れて、以下の正規表現を使用しましたが、それでも機能しません。これについて助けを求める:

.*(?<!abc-[\d-]{3})\.htm[^l]?$

正規表現の専門家の誰かがここで私を助けてくれませんか?

編集

これは私のテスト用 PHP コードです。

$regex = "/^(?!.*abc-[\d-]{3,5})[a-zA-Z0-9-]+\.html?$/";

foreach ( $matching2 as $k => $v ) {
    $matches = preg_match( $regex, $v );

    echo '"', $v, '"', ( $matches != 0 ) ? ' matches' : ' doesn\'t match', '<br />';
}
4

2 に答える 2

2

なんで逆に見る必要があるの?先読みを使用しないのはなぜですか?

^(?!.*abc-[\d-]{3,5}[^\d-])[a-zA-Z0-9-]+\.html?$

これは単に文字列の先頭から検索を開始し、先読みは文字列内の任意の場所 ( ) で許可されていない文字列を見つけようとし.*ます。そうである場合、先読みによってパターンが失敗します。これには、文字列が英数字とハイフンのみで構成されるという要件も含まれます。

ちなみに、これは、リンクした質問に使用されているのと同じソリューションです。Perl は、可変長の後読みにも対応できません。.NETのみが可能です。

別の注意: 実際に可変長の後読みが必要な例に遭遇した場合(可変長の先読みではありません)... 文字列 (そしてもちろんパターンも) を逆にします。;)

于 2012-11-19T22:49:27.007 に答える
1

あなたはおそらく正規表現パターンを探しています

^(?!.*abc-[\d-]{3,5}[^\d-])[A-Za-z0-9].*[.]html?$
于 2012-11-19T23:28:25.547 に答える