Есть две проблемы с вашей регулярное выражение, что я могу видеть на первый взгляд:
Во-первых, что символ трубы имеет особое значение в регулярном выражении, это означает ИЛИ. Например, это регулярное выражение:
[abc|def]
Будет соответствовать «abc» или «def».
Это означает, что ваши секции регулярного выражения '(| 555)' и '(|)' означают «ничего ИЛИ 555» для первого случая и «ничего или ничего» для второго случая.
Если вы хотите совместить символ трубы, вам нужно сбежать от него, поэтому '|' становится '\ |'.
Вторая проблема заключается в том, что. * Является жадным совпадением, он будет соответствовать как можно больше, и поскольку ваша точка представляет любого персонажа, вы получите соответствие прямо до следующей сопоставимой группы.
Так что, если мы фиксируем проблему трубы и получить это новое регулярное выражение:.
.*\|555(.*)\|
Использование пример строки, то * совпадений:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^^^^^^^^^^^^^^
Другими словами, он соответствует столько, сколько он может до следующей группы.
Вы можете переключиться с жадных на ленивых, добавив дополнительно? в конце, поэтому '. *' становится '. *?"Это остановит соответствие как только совпадение, ваше регулярное выражение теперь:
.*\|555(.*?)\|
И Ваша соответствующая группа теперь становится:
1|CI17438666|IB136180000001|55544001|10.106.1.XXX|
^^^^^
Если вы знаете, что символы следующие 555 всегда будет числовые цифры, то вы можете ограничить соответствующую группу только цифры, а не беспокоиться о жадной и ленивой:
.*\|555([0-9]*)\|
Надежде, что помогает.
Я выбираю ваш ответ как правильный ответ для подробного объяснения. Спасибо! – user1263746