^ と $ を削除すると、次の正規表現のみが機能するのはなぜですか?
^(?<=.).+(?=.)$
ソース:#Hello World#
ターゲット:Hello World
解決策を見つけることを楽しみにしています。
よろしくお願いします。
これらのルックアラウンドは、アンカーと組み合わせて使用することはできません。
^
文字列の先頭があることをアサートします (ただし、エンジンの「カーソル」の位置は進みません)。次に(?<=.)
、その位置の左に文字があることをアサートします。これはすべての場合において矛盾しています (ほとんどの場合、次の段落を参照してください)。(?=.)
と についても同様$
です。
複数行モード ( m
) では^
、$
文字列内の他のポイント、特に各行の先頭と末尾で一致する可能性があります。その場合、それらの位置の前後に他の文字 (改行文字) があります。ただし、単一行モードまたは「dotall」モード ( ) も使用していない限り.
、(ほとんどのエンジンで) で改行文字を照合することはできません。したがって、正規表現が一致する唯一のケースは、 と の両方を使用する場合です。s
m
s
おそらくあなたが探しているのはこれです:
(?<=^.).+(?=.$)
これは、別の文字があることを主張しますが、文字は1 つだけです (文字列の端ですぐに囲まれています)。
また、 と の間に違いがある理由を明確にする必要が(?=.)$
あり(?=.$)
ます。ルックアラウンドは、エンジンの「カーソル」の位置を進めません。つまり、 の場合(?=.)$
、エンジンは現在の位置の直後に別の文字が続くことを確認します。これが満たされ、先読みが残っている場合、エンジンは同じ位置にとどまります (これが先読みと呼ばれる理由です)。したがって、「カーソル」の位置をリセットする前に実際にチェックされるように、アンカーをルックアラウンドに入れる必要があります。
ルックアラウンドの詳細。(そのページのサイドバーには、これの 2 番目の部分もあります)
^(?<=.).+(?=.)$
次の文字列に一致すると言っているようなものです
矛盾しています。文字列を先頭に固定する場合、その前 (左側) に文字を配置することはできません。最後のアンカーはその逆です。