Разделение строки для последнего вхождения символа

#java #string #split

#java #строка #расколотый #разделение

Вопрос:

Я пытаюсь разделить строку в формате, подобном этому :

 "abc=cde,dfe=lk,f,sss=f,d,s" 
  

Я хотел бы восстановить эти значения на карте, используя первый набор символов в качестве ключа, а второй — в качестве значения.

Например

  • ключ: abc , значение: cde
  • ключ: dfe , значение: lk,f
  • ключ: sss , значение: f,d,s

Итак, разделяем эти значения для последнего вхождения «,».

Есть идеи о том, как это сделать?

Я пробовал с регулярным выражением и Stringtokenizer, но мне не удается восстановить только последнее вхождение «,»

Комментарии:

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

2. Вы могли бы разделить строку с помощью split(«,»), чтобы получить группы, а затем взаимодействовать с ними для разделения («=»).

Ответ №1:

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

 ,(?=(?:(?!,).)*=)
  

(см. в регулярном выражении 101)

Это соответствует a, , которое не имеет последующего , до следующего = .

Комментарии:

1. @Marconno : Вы правы. Голосование за. Я использовал ту же технику.

2. @Cetriolo нет проблем. Если это решило ваш вопрос, пожалуйста, отметьте этот или один из других ответов как «Принятый».

Ответ №2:

Для этого вам нужно использовать регулярное выражение.

Полный код :

 public class Test {
    
    public static void main(String args[]) {
        
        String input = "abc=cde,dfe=lk,f,sss=f,d,s";
        String[] arrOfStr = input.split(",(?=(?:(?!,).)*=)");
        
        HashMap<String, String> properties = new HashMap<String, String>();
        
        for(int i=0;i<arrOfStr.length;i  ) {
            String[] temp = arrOfStr[i].split("=");
            properties.put(temp[0], temp[1]);           
            
        }           
        System.out.println("Input String     : "  input);
        System.out.println("nFinal properties : ");
    
        properties.entrySet().forEach(entry->{
        System.out.println("key = "  entry.getKey()   " :: value = "   entry.getValue());  
     });

    }    
}
  

Вывод :

 Input String     : abc=cde,dfe=lk,f,sss=f,d,s

Final properties : 
key = dfe :: value = lk,f
key = sss :: value = f,d,s
key = abc :: value = cde
  

Ответ №3:

Полный код :

 public class Test {
    
    public static void main(String args[]) {
        String text = "abc=cde,dfe=lk,f,sss=f,d,s";
        String[] parts = text.split(",");
        Map<String, String> map = new LinkedHashMap<>();
        String key = null;
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < parts.length; i  ) {
            if (parts[i].contains("=")) {
                if (key != null) {
                    map.put(key, value.toString());
                    value.setLength(0);
                }
                String[] innerParts = parts[i].split("=");
                key = innerParts[0];
                value.append(innerParts[1]);
            } else {
                value.append(',').append(parts[i]);
            }
        }
        map.put(key, value.toString());
        for (Map.Entry<String, String> entry : map.entrySet()) {
            System.out.println(entry);
        }   
    }    
}
  

Выходной сигнал :

АВС=ЦРП

dfe=lk,f

sss=f,d,s