Ответ 1
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");
Как часть проекта для школы, мне нужно заменить строку из формы:
5 * x^3 - 6 * x^1 + 1
к чему-то вроде:
5x<sup>3</sup> - 6x<sup>1</sup> + 1
Я считаю, что это можно сделать с помощью регулярных выражений, но я еще не знаю, как это сделать.
Можете ли вы одолжить мне руку?
P.S. Фактическое назначение - реализовать приложение для обработки полиномиальной обработки Java, и я использую это для передачи polyomial.toString() из модели в представление, и я хочу, чтобы она отображалась с использованием тэгов html красиво.
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");
private String removeScript(String content) {
Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
return p.matcher(content).replaceAll("");
}
String input = "hello I'm a java dev" +
"no job experience needed" +
"senior software engineer" +
"java job available for senior software engineer";
String fixedInput = input.replaceAll("(java|job|senior)", "<b>$1</b>");
import java.util.regex.PatternSyntaxException;
// (:?\d+) \* x\^(:?\d+)
//
// Options: ^ and $ match at line breaks
//
// Match the regular expression below and capture its match into backreference number 1 «(:?\d+)»
// Match the character ":" literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
// Match the character " " literally « »
// Match the character "*" literally «\*»
// Match the characters " x" literally « x»
// Match the character "^" literally «\^»
// Match the regular expression below and capture its match into backreference number 2 «(:?\d+)»
// Match the character ":" literally «:?»
// Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
// Match a single digit 0..9 «\d+»
// Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
try {
String resultString = subjectString.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
} catch (PatternSyntaxException ex) {
// Syntax error in the regular expression
} catch (IllegalArgumentException ex) {
// Syntax error in the replacement text (unescaped $ signs?)
} catch (IndexOutOfBoundsException ex) {
// Non-existent backreference used the replacement text
}
Если это для любого общего математического выражения, и допустимы скобки, это будет очень сложно (возможно, невозможно) сделать это с помощью регулярных выражений.
Если единственные замены - те, которые вы показали, это не так сложно сделать. Сначала выровняйте *
, затем используйте захват, как показано на рисунке, чтобы Can Berk Güder обрабатывал ^
.
Каков ваш полином? Если вы "обрабатываете" его, я представлю какое-то дерево подвыражений, сгенерированных в какой-то момент, и подумал бы, что было бы гораздо проще использовать это для генерации вашей строки, чем для повторного анализа сырой выражение с регулярным выражением.
Просто бросать другой способ мышления. Я не уверен, что еще происходит в вашем приложении.
"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");
обратите внимание, что объединение обеих замен в одном регулярном выражении/замене было бы плохим выбором, потому что сработали бы более общие выражения, такие как x^3 - 6 * x
.
class Replacement
{
public static void main(String args[])
{
String Main = "5 * x^3 - 6 * x^1 + 1";
String replaced = Main.replaceAll("(?m)(:?\\d+) \\* x\\^(:?\\d+)", "$1x<sup>$2</sup>");
System.out.println(replaced);
}
}
Вы захотите просмотреть захват в регулярном выражении, чтобы обработать обертку 3 в ^ 3.
Попробуйте следующее:
String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");
Обязательно импортируйте java.util.regex.
Взгляните на antlr4. Это позволит вам значительно продвинуться в создании древовидной структуры, чем только регулярные выражения.
https://github.com/antlr/grammars-v4/tree/master/calculator (calculator.g4 содержит нужную грамматику)
В двух словах вы определяете грамматику для синтаксического анализа выражения, использования antlr для генерации java-кода и добавления обратных вызовов для обработки оценки при построении дерева.
Попробуйте это, возможно, не лучший способ. но он работает
String str = "5 * x^3 - 6 * x^1 + 1";
str = str.replaceAll("(?x)(\\d+)(\\s+?\\*?\\s+?)(\\w+?)(\\^+?)(\\d+?)", "$1$3<sup>$5</sup>");
System.out.println(str);