1

"*" ...baaack... からすべて (後方) に一致させようとしています。最初の ")" が停止するとすぐに見つかります。

例:

teeeext)
text))))
from next line start selecting because this is last ")")

SELECT
SELECT
SELECT
*** // stop selecting 

私はこの表現で来ました:

(?<=\)).+\*

しかし、これは最初の ")" から * までのすべてを選択します

4

4 に答える 4

3

)最後の文字から最初の文字まですべてを一致させたい場合は、次の*パターンを使用します。

(?<=\))[^)*]+\*

はまたは以外[^)*]の任意の文字を意味します。ただし、これには試合の最初のものが含まれます。を含めないようにしたい場合は、先読みを使用してください。 )***

(?<=\))[^)*]+(?=\*)

または、コードを少し変更したい場合は、グループを使用できます。

\)([^)*]+)\*

ただし、このグループを一致から抽出するには、もう少し作業を行う必要があります。

于 2013-08-14T11:21:02.160 に答える
1

この質問を正しく理解しているかどうか見てみましょう。最後の閉じ括弧 ( )) に続くすべてのものと一致させたいとします***
あなたが探している表現は、これだと思います:

preg_match('/(?<=\))[^)]+(?=\*{3})/m',$text, $matches);

サンプル文字列に適用すると、次のように返されます。

array (
    0 => '

      SELECT
      SELECT
      SELECT
      ',
)

使い方:

  • (?<=\)): 肯定的な後読み。式の残りの部分は、前に があった場合にのみ一致します。)
  • [^)]+: すべてに一致しますが)、これは、後読みが最後の終了を参照していることを確認するためです。一致しない文字)
    に含める必要はありません。*デリミタが 3 つのアスタリスク文字の場合でも、念のため、このパターンを非貪欲にすることができます: [^\)]+?. *終了区切り文字が 1 つのアスタリスクである可能性がある場合は、このクラスにを含める必要があります( [)*]+)。
  • (?=\*{3}): 前向きな先読み。前の ( [\)]+) は、その後に が続く場合にのみ一致できます。一致させたいセクションを区切るのに***
    単一で十分な場合は、正規表現を に変更してください。*/(?=\))[^)]+(?=\*)/
  • m:複数行の修飾子。例は複数行の文字列であるため、役立つ可能性があります

ルックアラウンド アサーションの一致はゼロ幅であり、一致の一部にはなりません。ジョブ完了。
主な「トリック」は、ルックアラウンドで使用する必要がある文字が正規表現の特別な文字で\*あり、エスケープする必要があることです\)*)

于 2013-08-14T11:28:04.000 に答える
0
\)([^(\))])*$

これは私のために働きます。

于 2013-08-14T11:27:27.620 に答える