Джава; Заменить строку (используя регулярные выражения)? - PullRequest
106 голосов
/ 10 марта 2009

В рамках школьного проекта мне нужно заменить строку из формы:

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

что-то вроде:

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

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

Можете ли вы помочь мне?

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

Ответы [ 12 ]

151 голосов
/ 10 марта 2009
str.replaceAll("\\^([0-9]+)", "<sup>$1</sup>");
30 голосов
/ 20 ноября 2013
private String removeScript(String content) {
    Pattern p = Pattern.compile("<script[^>]*>(.*?)</script>",
            Pattern.DOTALL | Pattern.CASE_INSENSITIVE);
    return p.matcher(content).replaceAll("");
}
15 голосов
/ 08 сентября 2012
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>");
9 голосов
/ 10 марта 2009
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
}
8 голосов
/ 24 июля 2016
"5 * x^3 - 6 * x^1 + 1".replaceAll("\\W*\\*\\W*","").replaceAll("\\^(\\d+)","<sup>$1</sup>");

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

3 голосов
/ 11 марта 2009

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

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

3 голосов
/ 10 марта 2009

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

Если единственными заменами являются те, которые вы показали, это не так сложно сделать. Сначала снимите *, затем используйте захват, как показал Кан Берк Гудер, для обработки ^.

1 голос
/ 16 сентября 2012
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);
    }
}
0 голосов
/ 12 апреля 2016

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

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

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

0 голосов
/ 11 февраля 2016

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...