string2 が件名のどこかに見つからない限り、string1の最後の出現を見つける必要があるパターンがあり、string1 の最初の出現が必要です。これを解決するために、私はこの非効率的な否定的な先読みを書きました。
/(.(?!.*?string2))*string1/
実行には数秒かかります (どちらの文字列も出現しないサブジェクトでは非常に長くなります)。これを達成するためのより効率的な方法はありますか?
以下を使用できるはずです。
/string1(?!.*?string2)/
これは、文字列の後半に見つからないstring1
限り一致しstring2
ます。これは要件を満たしていると思います。
編集:更新を確認したら、次のことを試してください。
/.*?string1(?=.*?string2)|.*string1/
正規表現で if/else ステートメントを実行することもできます。
(?(?=.*string2).*(string1).*$|^.*?(string1))
説明:
(? # If
(?=.*string2) # Lookahead, if there is string2
.*(string1).*$ # Then match the last string1
| # Else
^.*?(string1) # Match the first string1
)
が見つかった場合string1
は、グループ 1 で見つかります。
この正規表現を試してください:
string1(?!.*?string1)|string1(?=.*?string2)
所有演算子を使用してみてください.*+
。メモリの使用量が少なくなります (一致するケースのバックトレース全体が保存されるわけではありません)。このため、実行速度も速くなる可能性があります。