Как извлечь содержимое из sign, используя регулярное выражение в Java?

#java #regex

#java #регулярное выражение

Вопрос:

Мое содержимое представляет собой строку, подобную этой: whoad123@@${studentA.math1.math2}dsafddasfd${studentB.math2.math3} теперь я хочу извлечь содержимое, studentA,studentB которое находится в фигурных скобках и перед первым pot (${**}). Что не так с моим кодом?

 static java.util.regex.Pattern p1=java.util.regex.Pattern.compile("\*\$\{\w \}");
private static String getStudentName(String expression) {
    StringBuffer stringBuffer = new StringBuffer();
    java.util.regex.Matcher m1= p1.matcher(expression);
    while(m1.find()) {
        String param=m1.group(1);
        stringBuffer.append(param.substring(2,param.indexOf("\."))   ",");
    }
    if(stringBuffer.length()>0){
        return stringBuffer.deleteCharAt(stringBuffer.length()-1).toString();
    }
    return  null;
}
  

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

1. Используйте ${(w ) — экранируйте обратную косую черту. Результат в группе захвата. \* совпадает * буквально, и сопоставление } кажется ненужным. Ни одна часть вашей строки не похожа *${a}

2. Мой результат равен null

3. Пожалуйста, пересмотрите свой код. Смотрите рабочий пример tio.run здесь

4. @ctwheels вам также нужно избегать фигурной скобки { . Правильное регулярное выражение ${(w ) .

5. @CB_Ron спасибо за это — у меня было это в примере tio, не удалось добавить его в мое исходное регулярное выражение. Слишком поздно обновлять мой комментарий.

Ответ №1:

Использовать

 ${([^{}.] )
  

Смотрите доказательство

Объявить в Java как

 static java.util.regex.Pattern p1=java.util.regex.Pattern.compile("\$\{([^{}.] )");
  

ОБЪЯСНЕНИЕ

                          EXPLANATION
--------------------------------------------------------------------------------
  $                       '$'
--------------------------------------------------------------------------------
  {                       '{'
--------------------------------------------------------------------------------
  (                        group and capture to 1:
--------------------------------------------------------------------------------
    [^{}.]                   any character except: '{', '}', '.' (1
                             or more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of 1
  

Ответ №2:

 public static String getStudentName(String expression) {
    Pattern pattern = Pattern.compile("\{(?<student>\w )\.[^\}] \}");
    Matcher matcher = pattern.matcher(expression);
    List<String> names = new ArrayList<>();

    while (matcher.find()) {
        names.add(matcher.group("student"));
    }

    return String.join(",", names);
}
  

Смотрите демонстрацию в regex101.com