Подтвердить что ты не робот

Ява; String заменить (используя регулярные выражения)?

Как часть проекта для школы, мне нужно заменить строку из формы:

5 * x^3 - 6 * x^1 + 1

к чему-то вроде:

5x<sup>3</sup> - 6x<sup>1</sup> + 1

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

Можете ли вы одолжить мне руку?

P.S. Фактическое назначение - реализовать приложение для обработки полиномиальной обработки Java, и я использую это для передачи polyomial.toString() из модели в представление, и я хочу, чтобы она отображалась с использованием тэгов html красиво.

4b9b3361

Ответ 1

str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");

Ответ 2

private String removeScript(String content) {
    Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    return p.matcher(content).replaceAll("");
}

Ответ 3

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>");

Ответ 4

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
}

Ответ 5

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

Если единственные замены - те, которые вы показали, это не так сложно сделать. Сначала выровняйте *, затем используйте захват, как показано на рисунке, чтобы Can Berk Güder обрабатывал ^.

Ответ 6

Каков ваш полином? Если вы "обрабатываете" его, я представлю какое-то дерево подвыражений, сгенерированных в какой-то момент, и подумал бы, что было бы гораздо проще использовать это для генерации вашей строки, чем для повторного анализа сырой выражение с регулярным выражением.

Просто бросать другой способ мышления. Я не уверен, что еще происходит в вашем приложении.

Ответ 7

"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");

обратите внимание, что объединение обеих замен в одном регулярном выражении/замене было бы плохим выбором, потому что сработали бы более общие выражения, такие как x^3 - 6 * x.

Ответ 8

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);
    }
}

Ответ 9

Вы захотите просмотреть захват в регулярном выражении, чтобы обработать обертку 3 в ^ 3.

Ответ 10

Попробуйте следующее:

String str = "5 * x^3 - 6 * x^1 + 1";
String replacedStr = str.replaceAll("\\^(\\d+)", "<sup>\$1</sup>");

Обязательно импортируйте java.util.regex.

Ответ 11

Взгляните на antlr4. Это позволит вам значительно продвинуться в создании древовидной структуры, чем только регулярные выражения.

https://github.com/antlr/grammars-v4/tree/master/calculator (calculator.g4 содержит нужную грамматику)

В двух словах вы определяете грамматику для синтаксического анализа выражения, использования antlr для генерации java-кода и добавления обратных вызовов для обработки оценки при построении дерева.

Ответ 12

Попробуйте это, возможно, не лучший способ. но он работает

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);