5

string2 が件名のどこかに見つからない限り、string1の最後の出現を見つける必要があるパターンがあり、string1 の最初の出現が必要です。これを解決するために、私はこの非効率的な否定的な先読みを書きました。

/(.(?!.*?string2))*string1/

実行には数秒かかります (どちらの文字列も出現しないサブジェクトでは非常に長くなります)。これを達成するためのより効率的な方法はありますか?

4

5 に答える 5

3

以下を使用できるはずです。

/string1(?!.*?string2)/

これは、文字列の後半に見つからないstring1限り一致しstring2ます。これは要件を満たしていると思います。

編集:更新を確認したら、次のことを試してください。

/.*?string1(?=.*?string2)|.*string1/
于 2013-06-18T19:40:53.830 に答える
2

正規表現で 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 で見つかります。

于 2013-06-18T20:10:59.910 に答える
1

この正規表現を試してください:

string1(?!.*?string1)|string1(?=.*?string2)

ライブデモ: http://www.rubular.com/r/uAjOqaTkYH

正規表現イメージ

Debuggex でライブ編集

于 2013-06-18T20:12:26.920 に答える
0

所有演算子を使用してみてください.*+。メモリの使用量が少なくなります (一致するケースのバックトレース全体が保存されるわけではありません)。このため、実行速度も速くなる可能性があります。

于 2013-06-18T19:39:09.873 に答える