Написание регулярного выражения в Java. Использование метода string.split (). Я хочу, чтобы он прекратил расщепляться после первого появления '(' - PullRequest
1 голос
/ 16 февраля 2012

У меня есть строки с этим форматом: «a, b, c, d» и этот формат: «a (b, c, d)» Я хочу разделить на «,» или «,», но я хочу прекратить разделение, когда я сталкиваюсь с «(» во втором формате. Это то, что у меня было до того, как я начал взламывать.

String [] stringArray = string.split(", |,");

Массив первого формата будет содержать: «a», «b», «c», «d» Массив второго формата будет выглядеть как 'a (b, c, d)'

Пример:

String string1 = "ab,cd, de";
String string2 = "ab(de,ef);
String [] array1 = string1.split(...);
String [] array2 = string2.split(...);

array1 result: ["ab" "cd" "de"]
array2 result: ["ab(de,ef)"]

Количество символов между запятыми не ограничено. Я надеюсь, что это более понятно.

Спасибо.

Ответы [ 3 ]

1 голос
/ 17 февраля 2012

Если вы знаете, что круглые скобки всегда правильно сбалансированы и они никогда не будут вложены в другие парены, это будет работать:

String[] result = source.split(",\\s*(?![^()]*\\))");

Если заглядывающая сторона находит ), не видя (Во-первых, он должен быть внутри пары паренов.Учитывая эту строку:

"ab,cd, de,ef(gh,ij), kl,mn"

... result будет:

["ab", "cd", "de", "ef(gh,ij)", "kl", "mn"]
0 голосов
/ 17 февраля 2012

Используйте метод indexOf ().

Сначала проверьте, есть ли в строке символ "(".

   index = string.indexOf('(');  

   if(index ==-1)  // it means there is no '(' 
      {
        string.split(...);
      }
   else
      {
         subString = string.subString(0,index); // the part of the string before the '('

         // now do the following-
         // 1. proceed with split on substring

         // array1 = substring.split(...)

         // 2. Create a new array, insert the elements of array1 in it,
         // followed by the remaining part of the string

         // array2 = combine(array1, string.subString(index+1)); // <-- you will need to write this method   
      }
0 голосов
/ 16 февраля 2012

Я думаю, что вам может понадобиться негативный взгляд назад;согласно документу, регулярные выражения Java похожи (более или менее) на регулярные выражения Perl;но lookbehind переменной длины не реализован в Perl, поэтому (?<!\(.*),\s* не будет работать (он будет соответствовать запятой, за которой следует любое количество пробелов или пробелов, и ему не будет предшествовать (, за которым следует что-либо, то есть будет соответствовать запятойтолько если не предшествует ().

Я полагаю, что проще всего разбить первое вхождение ( (вы можете избежать регулярных выражений, чтобы сделать это) и по-разному обработать два получающихся сегмента, разбиваяпервый на , и добавление к последнему массиву второго (с добавлением возможно потерянного ().

РЕДАКТИРОВАТЬ

начиная с "a (b,d) "должен дать" a (b, d) ", вы должны добавить все, что следует после ( (включено), к последней разделенной строке из" первого "сегмента.Тем не менее, концепция, как написано ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...