2013-09-27 2 views
1

У меня есть строка Java "test/this/string", которую я хочу изменить на "string/this/test", используя регулярное выражение или самый эффективный алгоритм Java. То, как я знаю, - это использовать метод split, цикл над массивом и перестроить строку вручную. Число «/» может меняться и не фиксируется в фиксированном количестве раз. Есть идеи?Java RegEX To Split and Reverse String

+0

Что случилось с описанным вами методом? – nhgrif

ответ

0

Вот идея, используя lastIndexOf():

String str = "string/this/test"; 

StringBuilder rev = new StringBuilder(str.length()); 

int start = str.lastIndexOf('/'), end = str.length(); 

while (start >= 0) { 
    rev.append(str.substring(start + 1, end)); 
    rev.append('/'); 

    end = start; 
    start = str.lastIndexOf('/', start - 1); 
} 

rev.append(str.substring(0, end)); 

System.out.println(rev); 
 
test/this/string 
+0

Пропустить преобразование в список и вызвать обратный вызов. Вы можете напрямую перебирать массив split в обратном порядке! – isnot2bad

+0

@ isnot2bad Вы абсолютно правы, мне было излишне фантастично. – arshajii

+0

@ isnot2bad См. Редактирование; Я полностью изменил подход. – arshajii

0

Это может быть сделано в одной строке, используя регулярное выражение:

String reversed = str.replaceAll("(.*?)(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?(/.*?)?", "$9$8$7$6$5$4$3$2$1").replaceAll("^/", "");; 

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

Это работает для 1-9 частей.

+0

Предположительно, количество '/' s не будет известно раньше. – arshajii

+0

@arshajii так не читал. Возможно, ты прав. Если нет, значит, работает. Если да, то нет. Хотя, я сделал его работу на 1-9 частей сейчас. – Bohemian

+0

@Bohemian - части могут быть от 1 до многих ... не фиксированное число. – c12

0

Вот мое взятие:

String input = "test/this/string"; 
List<String> list = Arrays.asList(input.split("(?=/)|(?<=/)")); 
Collections.reverse(list); 
StringBuilder sb = new StringBuilder(); 
for (String s: list) 
    sb.append(s); 
System.out.println(sb.toString()); 

(?<=/) является нулевой длины соответствия регулярное выражение, которое соответствует, если предыдущий символ является /.
(?=/) - это регулярное выражение соответствия нулевой длины, которое соответствует, если следующий символ равен /.

Так (?=/)|(?<=/) матчи прямо до и после каждого /, таким образом split разбивает строку на "test", "/", "this", "/", "string".

Test.

+0

Вам не хватает «/» в вашем результате! – isnot2bad

+0

@ isnot2bad [Элементы '/' находятся на выходе] (http://ideone.com/MIWbn4). – Dukeling

+0

Вы правы! Я только видел петлю и был слишком поспешным! – isnot2bad