#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