2016-04-21 1 views
1

Мне нужно разбить строку на основе шаблона и снова мне нужно объединить ее обратно на части строки.Разделить строку на основе шаблона и слить его обратно

для ex: Ниже приведены фактические и ожидаемые строки.

String actualstr="abc.def.ghi.jkl.mno"; 
String expectedstr="abc.mno"; 

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

String[] splited = actualstr.split("[\\.\\.\\.\\.\\.\\s]+"); 

Хотя я могу Асесс строки, основанную на индексе, есть ли другой способ сделать это легко. Пожалуйста, порекомендуйте.

+0

, когда вы разделяете строку и сохраняете в массиве строк, ваша исходная строка остается неизменной. Так зачем сливаться? Вы можете использовать эту оригинальную строку. –

+0

Ну, вам нужно только '\\.' Один раз в '' и '' ', упрощая ваше регулярное выражение до' [\\. \\ s] + '. –

ответ

1

Я хотел бы использовать replaceAll в этом случае

String actualstr="abc.def.ghi.jkl.mno"; 
String str = actualstr.replaceAll("\\..*\\.", "."); 

Это заменит все с первой и последней . с .

Вы также можете использовать раскол

String[] parts = actualString.split("\\."); 
string str = parts[0]+"."+parts[parts.length-1]; // first and last word 
+0

Спасибо. Работает для меня :) – Karthik

2

Вы делаете не понимают, как работают регулярные выражения.

Вот ваше регулярное выражение без побегов: [\.\.\.\.\.\s]+

У вас есть класс символов ([]). Это означает, что нет причин иметь в нем более одного .. Вам также не нужно избегать . s в классе char.

Реальное эквивалентно регулярному выражению для регулярного выражения: [.\s]+. Как строка Java, которая составляет: "[.\\s]+".


Вы можете сделать .split("regex") на своей строке, чтобы получить массив. Очень просто получить решение с этого момента.

+0

oh my bad. Спасибо за комментарии. :) – Karthik

1
public static String merge(String string, String delimiter, int... partnumbers) 
{ 
    String[] parts = string.split(delimiter); 

    String result = ""; 

    for (int x = 0 ; x < partnumbers.length ; x ++) 
    { 
     result += result.length() > 0 ? delimiter.replaceAll("\\\\","") : ""; 
     result += parts[partnumbers[x]]; 
    } 

    return result; 
} 

, а затем использовать его как:

merge("abc.def.ghi.jkl.mno", "\\.", 0, 4); 
1

Я хотел бы сделать это таким образом

Pattern pattern = Pattern.compile("(\\w*\\.).*\\.(\\w*)"); 
    Matcher matcher = pattern.matcher("abc.def.ghi.jkl.mno"); 
    if (matcher.matches()) { 
     System.out.println(matcher.group(1) + matcher.group(2)); 
    } 

Если вы можете кэшировать результат

Pattern.compile("(\\w*\\.).*\\.(\\w*)") 

и повторного использования " шаблон ", этот код будет очень эффективным как компоновка шаблонов является самой дорогой. java.lang.String.split(), который предлагает другие ответы, использует тот же шаблон Pattern.compile() внутри, если длина шаблона больше 1. Значение означает, что он будет выполнять эту дорогостоящую операцию компиляции шаблона при каждом вызове метода. См. java.util.regex - importance of Pattern.compile()?. Поэтому гораздо лучше иметь шаблон, скомпилированный, кэшированный и повторно используемый.

matcher.group (1) относится к первой группе(), которая является "(\ w * \.)" matcher.group (2) относится ко второй, которая является "(\ w *)"

, хотя мы не используем его здесь, а просто отметим, что группа (0) является совпадением для всего регулярного выражения.

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