Что RegEx отделяет термины полинома - PullRequest
1 голос
/ 10 октября 2019

У меня есть строка 5x ^ 3-2x ^ 2 + 5x Я хочу регулярное выражение, которое разбивает эту строку как 5x ^ 3, -2x ^ 2, 5x

Я пытался "(-)|(\\+)", но это не сработало. Так как он не учитывал отрицательные термины власти.

Ответы [ 3 ]

1 голос
/ 10 октября 2019

Вы можете разделить вашу строку, используя это регулярное выражение,

\+|(?=-)

. Способ, которым это работает, разбивает строку, потребляющую символ +, но если есть -, то она разделяется, используя -но не потребляет -, поскольку это предвидение.

Проверьте этот код Java,

String s = "5x^3-2x^2+5x";
System.out.println(Arrays.toString(s.split("\\+|(?=-)")));

Дает ожидаемый результат ниже,

[5x^3, -2x^2, 5x]

Редактировать:

Хотя в одном из комментариев ОП в своем посте он сказал, что не будет отрицательных способностей, но только в том случае, если у вас также есть отрицательные способности, вы можете использовать это регулярное выражение, которое обрабатываеттакже отрицательные силы,

\+|(?<!\^)(?=-)

Проверьте этот обновленный код Java,

List<String> list = Arrays.asList("5x^3-2x^2+5x", "5x^3-2x^-2+5x");
for (String s : list) {
    System.out.println(s + " --> " +Arrays.toString(s.split("\\+|(?<!\\^)(?=-)")));
}

Новый вывод,

5x^3-2x^2+5x --> [5x^3, -2x^2, 5x]
5x^3-2x^-2+5x --> [5x^3, -2x^-2, 5x]
0 голосов
/ 10 октября 2019

Может быть,

-?[^\r\n+-]+(?=[+-]|$)

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

Демо

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class RegularExpression{

    public static void main(String[] args){

        final String regex = "-?[^\r\n+-]+(?=[+-]|$)";
        final String string = "5x^3-2x^2+5x\n"
             + "5x^3-2x^2+5x-5\n"
             + "-5x^3-2x^2+5x+5";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}

Если вы хотите упростить / изменить / изучить выражение, это объяснено на верхней правой панели regex101.com . Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

0 голосов
/ 10 октября 2019

В приведенной ниже программе вы можете получить разрыв каждой переменной. Так что отлаживайте и объединяйте регулярные выражения по мере необходимости. Это будет хорошо работать для всех входных данных.

import java.util.regex.*;

class Main
{
  public static void main(String[] args)
  {
    String txt="5x^3-2x^2+5x";

    String re1="([-+]\\d+)";    // Integer Number 1
    String re2="((?:[a-z][a-z0-9_]*))"; // Variable Name 1
    String re3="(\\^)"; // Any Single Character 1
    String re4="([-+]\\d+)";    // Integer Number 2
    String re5="([-+]\\d+)";    // Integer Number 1
    String re6="((?:[a-z][a-z0-9_]*))"; // Variable Name 2
    String re7="(\\^)"; // Any Single Character 2
    String re8="([-+]\\d+)";    // Integer Number 3
    String re9="([-+]\\d+)";    // Integer Number 2
    String re10="((?:[a-z][a-z0-9_]*))";    // Variable Name 3

    Pattern p = Pattern.compile(re1+re2+re3+re4+re5+re6+re7+re8+re9+re10,Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(txt);
    if (m.find())
    {
        String int1=m.group(1);
        String var1=m.group(2);
        String c1=m.group(3);
        String int2=m.group(4);
        String signed_int1=m.group(5);
        String var2=m.group(6);
        String c2=m.group(7);
        String int3=m.group(8);
        String signed_int2=m.group(9);
        String var3=m.group(10);
        System.out.print("("+int1.toString()+")"+"("+var1.toString()+")"+"("+c1.toString()+")"+"("+int2.toString()+")"+"("+signed_int1.toString()+")"+"("+var2.toString()+")"+"("+c2.toString()+")"+"("+int3.toString()+")"+"("+signed_int2.toString()+")"+"("+var3.toString()+")"+"\n");
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...