2013-06-04 2 views
0

У меня есть строка выглядит следующим образом:лучший способ для создания строки в Java

«Это @awesome @dude»

Из этой строки я хочу, чтобы извлечь удивительный и чувак и создать строку

output==> "awesome,dude" 

Так что мой код, как следующее:

Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(textStr); 
while (matcher.find()){ 
    mergedStr += matcher.group() +","; 
} 

Но это создает артефакт в ванной d

output==> "awesome,dude," //<-- egghh comma.. in the end 

Что является лучшим способом решить эту проблему.

+1

Вы добавляете дополнительную запятую с объединеннымStr + = matcher.group() + ","; линия. – rajah9

+0

Проблема не в регулярном выражении, а только на том, как вы строите результат. –

+0

Ну, вы можете либо обрезать постороннюю запятую, либо никогда не добавлять ее в первую очередь. Один из способов сделать последнее - сделать первое слово вне цикла, а затем добавить запятую вверху цикла. –

ответ

1

Это один вариант:

Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(textStr); 
while (matcher.find()){ 
    if (!mergedStr.isEmpty()) 
     mergedStr += ","; 
    mergedStr += matcher.group(); 
} 
+4

+1 для этого простого решения, но, пожалуйста, избегайте операторов без фигурных скобок. Это довольно плохая практика. –

+1

Это решает проблему, но я думаю, что это был бы лучший ответ, если бы вы упомянули, что он должен использовать 'StringBuilder'. :-) – ruakh

+0

@adenoyelle Я думаю, что буду хранить свои 1-строчные if-утверждения без фигурных скобок, я вообще против фигурных скобок в любом месте. Но все это просто мнения. – Dukeling

1

Вот еще один общий подход:

Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(textStr); 
StringBuilder sb = new StringBuilder(); 
while (matcher.find()){ 
    sb.append(matcher.group()).append(","); 
} 
return sb.toString().replaceAll(",$", ""); 

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

Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(textStr); 
StringBuilder sb = new StringBuilder(); 
while (matcher.find()){ 
    sb.append(matcher.group()).append(","); 
} 
if (sb.length() == 0) { 
    return ""; 
} 
else { 
    return sb.toString().substring(0, sb.length() - 1); 
} 
+0

Не работает, потому что String.replace делает не принимать регулярные выражения. Если вместо этого вы используете replaceAll, он работает. –

+0

Хороший вопрос ... Не знаю, как я забыл (слишком много JavaScript в последнее время). Исправленный. – jahroy

+0

'return mergedStr.substring (0, mergedStr.length() - 1);' может быть лучшим вариантом. – Dukeling

3

Другой подход:

boolean needComma = false; 
while (blah, blah, blah) { 
    if (needComma) { 
     string += ","; 
    } 
    string += word; 
    needComma = true; 
} 

Но есть десяток разных подходов.

0
String input = "@[email protected]"; 
     List<String> strSplit = new ArrayList<String>(); 
     String result = ""; 

     Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(input); 
     while (matcher.find()){ 
      strSplit.add(matcher.group()); 

     } 
     for(int j = 0; j< strSplit.size(); j++){ 
      result = result + strSplit.get(j); 
      if(j < strSplit.size() -1){ 
       result = result+","; 
      } 
     } 
     System.out.println("Result : " + result); 
1

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

Я знаю, microoptimizations бла, бла, шестой круг ада, бла, бла, но только в том числе здесь для вашего развлечения:

Matcher matcher = Pattern.compile("(?<[email protected])\\w+").matcher(textStr); 
    StringBuilder mergedStr = new StringBuilder(); 
    if (matcher.find()) { 
     mergedStr.append(matcher.group()); 
     while (matcher.find()) { 
     mergedStr.append(',').append(matcher.group()); 
     } 
    } 
    return mergedStr.toString(); 

Кроме того, я не 100% уверен, что замена квадратичный алгоритм (конкатенация строк) с линейным алгоритмом (StringBuilder) квалифицируется как микрооптимизация в плохом смысле.

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