Настройка регулярного выражения в объекте Pattern для Java-строки
Я пытаюсь получить все совпадения в строке Java. Совпадения должны быть основаниями и степенями в математическом уравнении. Как вы знаете, основания и полномочия могут быть как отрицательными, так и десятичными. У меня есть шаблон, регулярное выражение и соответствие. Это выглядит примерно так, но не дает мне того, чего я ожидаю. Я руководствовался этим постом здесь, в Stackru Regex, чтобы найти целое или десятичное число из строки в Java в одной группе?
Я действительно просто заинтересован в захвате сил, имеющих отрицательные показатели как целые, так и нецелые.
Ну вот мой код:
String ss = "2.5(4x+3)-2.548^-3.654=-14^-2.545";
String regex = "(\\d^+(?:\\d+)?)";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(ss);
while(m.find()){
System.out.println("Wiwi the cat: "+m.group(1));
}
Вывод этого кода - ничто. Любые идеи или предложения будут великолепны.
Спасибо
2 ответа
Ваша основная проблема в этом персонаже: ^
, Это означает "начало ввода", поэтому ваше регулярное выражение не может ничего найти.
Вы должны избежать этого \^
так что это становится буквальным.
Я также исправил остаток вашего регулярного выражения:
String regex = "-?\\d+(\\.\\d*)?(\\^-?\\d+(\\.\\d*)?)?";
Смотрите живую демонстрацию.
И использовать
match.group(); // the whole match
РЕДАКТИРОВАТЬ: заменено [0123456789]
с (\\d)
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: добавлен контекст для OP
Ответ
Вот шаблон, который должен соответствовать тому, что вам нужно:
-?(\\d)+(\\.(\\d)+)?\\^-?(\\d)+(\\.(\\d)+)?
объяснение
-?
- ноль или один минус символы
(\\d)+
- одна или несколько цифр
(\\.(\\d)+)?
- (необязательно) десятичная точка, за которой следуют одна или несколько цифр
\\^
- один символ каретки
Используя это на вашем входе с String.replace(pattern, "[FOUND]")
произведено:
"2.5(4x+3)[FOUND]=[FOUND]"
В контексте вашего ответа просто замените regex
с тем, который я написал, и использовать m.group()
вместо m.group(1)
,
String ss = "2.5(4x+3)-2.548^-3.654=-14^-2.545";
String regex = "-?(\\d)+(\\.(\\d)+)?\\^-?(\\d)+(\\.(\\d)+)?";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(ss);
while(m.find()) {
System.out.println("Wiwi the cat: " + m.group());
}
Удачи!