2015-04-04 3 views
2

У меня есть строка, которая является цепным вызовом процесса, и мне нужно получить отдельные процессы в списке, чтобы затем я мог работать с отдельными процессами.Сплит String в Java с предыдущим символом

Для примера.

, если у меня есть

'funca("hello world").funcb("this.is.sparta").funcc()'

Я хочу, чтобы получить ArrayList, который имеет

['funca("hello world")' , 'funcb("this.is.sparta")' , 'funcc()']

Теперь я не могу разделить строку на '' поскольку передаваемые параметры также могут иметь значение. персонаж. Я пробовал раскалываться »). но это заканчивается тем, что уродливые глядя расколе

['funca("hello world"' , 'funcb("this.is.sparta"' , 'funcc()']

Поэтому в основном то, что мне сейчас нужно это способ разделить на «).», но разделить только на связанный с ним «». Возможно ли это с помощью функции split? Или я должен получить все места »). а затем вручную разделить?

Я не уверен, как действовать дальше. Указатели очень оценили.

+0

Это 'funca (" this. (Is) .sparta "). Funcb()' правильный/возможный ввод? – Pshemo

ответ

3

Вы можете использовать позитивный назад 'в вашем регулярном выражении:

String text = "funca(\"hello world\").funcb(\"this.is.sparta\").funcc()"; 
String[] split = text.split("(?<=\\))\\."); 
System.out.println(Arrays.toString(split)); 

Выход:

[funca("hello world"), funcb("this.is.sparta"), funcc()] 

Регулярное выражение (?<=\))\. соответствует точке, которой предшествует ).

0

Вы действительно не разделяете строку на каком-либо символе, а идентифицируете шаблон в большой строке. Итак, вместо того, чтобы использовать String#split(), вы должны использовать Matcher#find(), чтобы найти все шаблоны, которые соответствуют func(arg1, arg2, ...). Эта модель будет что-то вроде этого:

\\w+\\([^)]*\\) 

Код:

String str= "funca(\"hello world\").funcb(\"this.is.sparta\").funcc()"; 
Matcher matcher = Pattern.compile("\\w+\\([^)]*\\)").matcher(str); 

List<String> matchedFunction = new ArrayList<String>(); 
while (matcher.find()) { 
    matchedFunction.add(matcher.group()); 
} 

System.out.println(matchedFunction); 
+0

Что такое 'func (arg, arg, arg)' здесь? Я не вижу актуальности. – CandiedOrange

+0

@CandiedOrange Я уверен, что '' hello world ''в' funca («hello world») 'является аргументом .. Там может быть несколько аргументов. –

+0

Да, но проблема в вопросе о точках, не запятых , Какое это имеет значение, если есть несколько аргументов? – CandiedOrange

Смежные вопросы