1

オプションで終わる文字列に一致し、; 必須ではないため、そのグループをキャプチャしません。ただし、最初の条件の後に発生する残りの文字列をキャプチャしてください。

文1:transfer from source not possible; snapmirror may be misconfigured, the source volume may be busy or unavailable.

テキスト 2:snapmirror may be modified, the destination volume is unavailable.

望ましい出力:

snapmirror may be misconfigured, the source volume may be busy or unavailable

snapmirror may be modified, the destination volume is unavailable

正規表現で「ソースから転送できません」またはセミコロンの前にそのように発生する文字列を探し、正規表現でこれをグループとしてキャプチャしないようにします。

また、セミコロンから最後まですべてキャプチャしたいと考えています。

試した正規表現:(?:.*;)? (.+)\..*

上記の正規表現は Text1 では機能しますが、Text2 では機能しません。誰でもこれを修正するのを手伝ってくれますか?

4

1 に答える 1

0

あなたの正規表現は機能するはずですが、おそらく改善される可能性があります。

  • 一致は常に文字列の先頭から開始する必要がありますか? (これはひっかけ問題です。その仮定ができない場合、その質問はまったく意味がありません。)

  • 複数のセミコロンが存在することはありますか? その場合、非キャプチャー部分を最初の部分までだけ拡張しますか、それとも最後の部分まで拡張しますか?

  • 常に文字列の最後で終了する必要がありますか、それともピリオドまで一致させたいですか? 複数の期間が存在することはありますか?

この最小限に変更された正規表現は、あなたが望むことをしているように見えます.追加されたアンカーは、おそらくあなたのニーズを満たすのに十分なほどパフォーマンスを向上させます:

^(?:.*?;\s*)?(.+)\..*$

これはかなり高速です。.*否定された文字クラス ([^;]*および)に置き換えると、[^.]+バックトラッキングがほぼ完全になくなります。

^(?:[^;]*;\s*)?([^.]+)

それらをサポートする正規表現フレーバーを使用している場合、アトミック グループと所有量指定子を使用すると、さらに高速になります。

^(?>[^;]*+;\s*+)?+([^.]++)
于 2013-06-11T08:16:38.203 に答える