たとえば、電話番号があり、最後の 2 桁のいずれかに 7 が含まれているかどうかを確認したい場合、純粋に正規表現でこれを行うことができますか、それとも最初に文字列を分割する必要がありますか?
2 に答える
正規表現を使用できます:
7\d?$
これは、最後または最後から 2 番目の位置にある 7 に一致します。または、より正確には、文字列の最後の 7 に一致し、オプションで別の数字が続きます。これは、最後の 2 つの場所のいずれかで 7 に変換されます。
ルックアラウンドを使用して、文字列の任意のインデックスで一致させることができます。ルックビハインドを使用 して、左側に一定数の文字(?<=)が続いていることを確認します。start of stringを先読みし(?=)て、右側に一定数の文字があり、その後に が続くことを確認しend of stringます。
文字列の先頭からのインデックス:
(?<=^.{N})REGEX
あなたREGEXはN番目(ゼロベース)のインデックスから一致するので、左から3番目の文字がx次の文字列にあるかどうかを確認したい場合は、 where is 正規表現を12x45使用して、文字が.(?<=^.{2})xxx
先読みを使用すると、最後から同じことができます。
REGEX(?=.{N}$)
したがって、最後の2桁のいずれかが7であるかどうかを確認するには、正規表現は次のようになります7\d?(?=.{0}$)(これはジョーイが提案したものと同等です。しかし、これはすべてのインデックスで機能することがわかります(単純なものの代わりにこれを使用する必要があるとは言っていません。より一般的な正規表現です)。
左から 3 番目 (ゼロ ベース) の文字かどうかを確認したい場合はx、驚くことではありませんが、x(?=.{2}$).
2 つを組み合わせてインデックス間をチェックすることもできます。たとえば、両端の 3 桁目の間のすべてが任意の数のx's であるかどうかをチェックしたい12xxxxxx21場合は、次のようになります。
(?<=^.{2})x*(?=.{2}$)
注:
一致する/一致しない正規表現だけが必要な場合は、ルックアラウンドなしで実行できますが、REGEX.
例えば:
(?<=^.{2})x*(?=.{2}$)xxxxxxas は上記の例に一致しますが、 asは文字列に一致しますが、 だけではなく ( )^.{2}x*.{2}$全体に一致します。12xxxxxx21xxxxxx