String[] tests = {
"a,b,c,d,e,f",
"a,b,~c~,d,e",
"~a,b,c,d,e~",
"a,b,c,~d,e,f~,g,h,i,~j,k,l,~m,n,o~,q,r,~s,t,u",
};
for (String test : tests) {
System.out.println(
test.replaceAll(
"(^[^~]*~)|([^~]*$)|([^,~]*),|([^,~]*~[^~]*~)",
"$1$2$3$4"
)
);
}
Вышеуказанные отпечатки:
a,b,c,d,e,f
a,b,~c~,d,e
~abcde~
a,b,c,~def~,g,h,i,~jkl~m,n,o~qr~s,t,u
Как это работает
Есть 4 случая:
- Мы находимся в начале строки, "снаружи"
- Просто совпадите, пока мы не найдем первый
~
, поэтому в следующий раз мы будем "внутри"
- Итак,
(^[^~]*~)
- Больше нет
~
до конца строки
- Если есть четное число
~
, мы будем "снаружи"
- Просто совпадать до конца
- Итак,
([^~]*$)
- Если ничего из вышеперечисленного нет, мы "внутри"
- Продолжайте находить следующую запятую до
~
(поэтому мы все еще "внутри")
- Итак,
([^,~]*),
(не запятую!)
- Если мы найдем
~
вместо запятой, то выйдем и вернемся к следующему ~
Во всех случаях мы стараемся захватить достаточно, чтобы восстановить строку.
Ссылки
Похожие вопросы