为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式如何分隔多项式的项

正则表达式如何分隔多项式的项

温温酱 2023-10-13 10:21:12
我有一个字符串5x^3-2x^2+5x 我想要一个正则表达式,将该字符串拆分为 5x^3, -2x^2, 5x我尝试过"(-)|(\\+)",但这没有用。因为它没有考虑负幂项。
查看完整描述

3 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

您可以使用此正则表达式分割字符串,


\+|(?=-)

它的工作方式是,它分割字符串消耗+字符,但如果有的话-它会分割使用-但不消耗-,因为这是向前看的。


看看这个Java代码,


String s = "5x^3-2x^2+5x";

System.out.println(Arrays.toString(s.split("\\+|(?=-)")));

下面给出了您的预期输出,


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

编辑:


尽管在OP在他的帖子中的评论之一中他说,不会有负权力,但以防万一你也有负权力,你可以使用这个正则表达式来处理负权力,


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

检查这个更新的 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]


查看完整回答
反对 回复 2023-10-13
?
POPMUISE

TA贡献1765条经验 获得超5个赞

或许,

-?[^\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的右上角面板上进行解释。如果您愿意,您还可以在此链接中观看它如何与某些示例输入进行匹配。


正则表达式电路

jex.im可视化正则表达式:

https://img1.sycdn.imooc.com/6528aad30001cf1304200194.jpg

查看完整回答
反对 回复 2023-10-13
?
12345678_0001

TA贡献1802条经验 获得超5个赞

在下面的程序中,您可以中断每个变量。因此,请对其进行调试并根据需要组合正则表达式。它适用于所有输入。


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

    }

  }

}


查看完整回答
反对 回复 2023-10-13
  • 3 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信