0

^ と $ を削除すると、次の正規表現のみが機能するのはなぜですか?

^(?<=.).+(?=.)$

ソース:#Hello World#
ターゲット:Hello World

解決策を見つけることを楽しみにしています。
よろしくお願いします。

4

3 に答える 3

4

これらのルックアラウンドは、アンカーと組み合わせて使用​​することはできません。

^文字列の先頭があることをアサートします (ただし、エンジンの「カーソル」の位置は進みません)。次に(?<=.)、その位置の左に文字があることをアサートします。これはすべての場合において矛盾しています (ほとんどの場合、次の段落を参照してください)。(?=.)と についても同様$です。

複数行モード ( m) では^$文字列内の他のポイント、特に各行の先頭と末尾で一致する可能性があります。その場合、それらの位置の前後に他の文字 (改行文字) があります。ただし、単一行モードまたは「dotall」モード ( ) も使用していない限り.、(ほとんどのエンジンで) で改行文字を照合することはできません。したがって、正規表現が一致する唯一のケースは、 と の両方を使用する場合です。sms

おそらくあなたが探しているのはこれです:

(?<=^.).+(?=.$)

これは、別の文字があることを主張しますが、文字は1 つだけです (文字列の端ですぐに囲まれています)。

また、 と の間に違いがある理由を明確にする必要が(?=.)$あり(?=.$)ます。ルックアラウンドは、エンジンの「カーソル」の位置を進めません。つまり、 の場合(?=.)$、エンジンは現在の位置の直後に別の文字が続くことを確認します。これが満たされ、先読みが残っている場合、エンジンは同じ位置にとどまります (これが先読みと呼ばれる理由です)。したがって、「カーソル」の位置をリセットする前に実際にチェックされるように、アンカーをルックアラウンドに入れる必要があります。

ルックアラウンドの詳細。(そのページのサイドバーには、これの 2 番目の部分もあります)

于 2013-06-15T18:37:44.517 に答える
1

^(?<=.).+(?=.)$次の文字列に一致すると言っているようなものです

  • 文字列の最初と最後に固定
  • 一致の前に文字 (一致の一部ではない) が続く
  • 試合終了後、(試合の一部ではない)キャラクターの後に続いた

矛盾しています。文字列を先頭に固定する場合、その前 (左側) に文字を配置することはできません。最後のアンカーはその逆です。

于 2013-06-15T18:36:57.177 に答える