Существует регулярное выражение, которое будет обрабатывать все ваши крайние случаи, и вам нужно будет выполнить только одну операцию замены:
SET n.SWAP_ID = apoc.text.replace(
n.SWAP_ID,
'(^|(?<=_))' + $search + '($|(?=_))',
$replace)
Пояснение
апо * 1032 Функция * .text.replace просто использует метод Java String.replaceAll , поэтому поддерживается любое регулярное выражение, соответствующее документированному шаблону .
Для вашего конкретного c варианта использования это регулярное выражение должно работать хорошо:
(^|(?<=_))123($|(?=_))
- Шаблон
(^|(?<=_))
ищет либо начало входной строки, либо подчеркивание, но любое совпадение подчеркивание не будет заменено. - Шаблон
($|(?=_))
ищет конец входной строки или подчеркивание, но любое совпадающее подчеркивание не будет заменено. - Кроме того, эти шаблоны разрешить рассматривать одно и то же подчеркивание несколько раз (например, в строке "123_123", как в качестве завершающего, так и в качестве нижнего подчеркивания).
Например, этот запрос :
UNWIND [
"1234_12314123_123",
"123_1312323_1234",
"12434_12314123_123",
"1243_123_1123",
"123_123_123",
"123"
] AS x
RETURN x, apoc.text.replace(x, "(^|(?<=_))123($|(?=_))", "000") AS y
дает такой результат:
╒════════════════════╤════════════════════╕
│"x" │"y" │
╞════════════════════╪════════════════════╡
│"1234_12314123_123" │"1234_12314123_000" │
├────────────────────┼────────────────────┤
│"123_1312323_1234" │"000_1312323_1234" │
├────────────────────┼────────────────────┤
│"12434_12314123_123"│"12434_12314123_000"│
├────────────────────┼────────────────────┤
│"1243_123_1123" │"1243_000_1123" │
├────────────────────┼────────────────────┤
│"123_123_123" │"000_000_000" │
├────────────────────┼────────────────────┤
│"123" │"000" │
└────────────────────┴────────────────────┘