Скорее всего, вам лучше всего делать эскапинг и расщепление в одном проходе. Я знаю, что это неправильно с точки зрения разделения двух отдельных частей функциональности, но он избегает некоторых неловких угловых случаев (например, представьте «foo \; bar», где; следует за обратной косой чертой, но все еще является разделителем).
Вот некоторый чрезвычайно упрощенный код для анализа - он предполагает, что любая обратная косая черта в основном означает «обрабатывать следующий символ как простой ввод», но это все.
import java.util.*;
public class Test
{
public static void main(String[] args)
{
List<String> parsed = parse(args[0]);
for (String x : parsed)
{
System.out.println(x);
}
}
public static List<String> parse(String text)
{
List<String> ret = new ArrayList<String>();
StringBuilder current = new StringBuilder();
boolean escaping = false;
for (int i=0; i < text.length(); i++)
{
char c = text.charAt(i);
if (escaping)
{
current.append(c);
escaping = false;
}
else
{
if (c == '\\')
{
escaping = true;
}
else if (c == ';')
{
ret.add(current.toString());
current = new StringBuilder();
}
else
{
current.append(c);
}
}
}
if (escaping)
{
throw new IllegalArgumentException("Ended in escape sequence");
}
ret.add(current.toString());
return ret;
}
}
(Обратите внимание, что это не делает бизнес для разделения каждой записи на несколько полей, но вам просто нужно изменить то, что вы делаете с помощью ';', а также реагировать на '-' - принцип тот же. )