一見したところ、正規表現には2つの問題があります。
1 つ目は、パイプ文字が正規表現で特別な意味を持ち、OR を意味することです。たとえば、この正規表現は次のとおりです。
[abc|def]
「abc」または「def」に一致します。
これは、正規表現セクション '(|555)' および '(|)' が、最初のケースでは 'nothing OR 555' を意味し、2 番目のケースでは 'nothing OR Nothing' を意味することを意味します。
パイプ文字に一致させたい場合は、エスケープする必要があるため、「|」'\|' になります。
2 番目の問題は、.* は貪欲なマッチャーであり、可能な限り一致することです。ドットは任意の文字を表すため、次の一致するグループまですぐに一致します。
したがって、パイプの問題を修正して、この新しい正規表現を取得すると:
.*\|555(.*)\|
サンプル文字列を使用すると、.* は次のように一致します。
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
つまり、次のグループが一致するまで、可能な限り一致します。
余分な ? を追加することで、貪欲から怠惰に切り替えることができます。'.*' は '.*?' になります。これは、一致が行われるとすぐに一致を停止します。正規表現は次のようになります。
.*\|555(.*?)\|
一致するグループは次のようになります。
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
555 に続く文字が常に数字であることがわかっている場合は、一致するグループを数字だけに制限することができ、欲張りや怠惰について心配する必要はありません。
.*\|555([0-9]*)\|
それが役立つことを願っています。