5

わかりましたので、* の後に 1 ~ 4 個のスペースまたはタブが続き、その後にテキスト行が続く正規表現が必要なプロジェクトに取り組んでいます。現在、テスト目的で後読みの後に .* を使用しています。ただし、1、2、または 4 つのスペース/タブに明示的に一致させることはできますが、1 ~ 4 には一致させることはできません。次のブロックに対してテストしています

*    test line here
*   Second test
*  Third test
* Another test

そして、これらは私がテスト(?<=(\*[ \t]{3})).*している 2 つのパターンで、期待どおりに機能し、2 行目に(?<=(\*[ \t]{1,4})).*一致します。私は正直に理由を理解できません。私は成功せずにグーグルを試みました。g(lobal) フラグを使用しています。

4

1 に答える 1

5

PHPは、多くのフレーバーと同様に、可変長ルックビハインドをサポートしていません。唯一のサポートは、後読みのトップレベルでの交互( )です。|でも?パターンを壊すことができます。別の方法は、次を使用することです。

(?<=\*[ \t]|\*[ \t]{2}|\*[ \t]{3}|\*[ \t]{4}).*

または、グループの後読みを中止することをお勧めします。

\*[ \t]{1,4}(.*)

とにかくマッチが重なっているようには見えないので、これはあなたにとってうまくいくはずです。

マニュアルから:

後読みアサーションの内容は、一致するすべての文字列が固定長でなければならないように制限されています。ただし、いくつかの選択肢がある場合、それらすべてが同じ固定長である必要はありません。したがって、(?<= bullock | donkey)は許可されますが、(?<!dogs?| cats?)はコンパイル時にエラーを引き起こします。異なる長さの文字列に一致するブランチは、ルックビハインドアサーションのトップレベルでのみ許可されます。

ソース:http ://www.php.net/manual/en/regexp.reference.assertions.php

于 2011-02-10T11:47:46.343 に答える