2

我一直在尝试将此数学函数替换x^2*sqrt(x^3)pow(x,2)*Math.sqrt(pow(x,3))

所以这是正则表达式

/([0-9a-zA-Z\.\(\)]*)^([0-9a-zA-Z\.\(\)]*)/ pow(\1,\2)

它在 ruby​​ 中工作,但我找不到在 java 中的方法,我尝试了这个方法

String function=  "x^2*sqrt(x^3)";

  Pattern p = Pattern.compile("([a-z0-9]*)^([a-z0-9]*)");
  Matcher m = p.matcher(function);

  String out = function;

  if(m.find())
  {
      System.out.println("GRUPO 0:" + m.group(0));
      System.out.println("GRUPO 1:" + m.group(1));
      out = m.replaceFirst("pow(" + m.group(0) + ", " + m.group(1) + ')');
  }
      String funcformat = out;
      funcformat = funcformat.replaceAll("sqrt\\(([^)]*)\\)", "Math.sqrt($1)"); 

      System.out.println("Return Value :"+ funcion );
      System.out.print("Return Value :"+ funcformat );

但仍然不起作用,输出是:pow(x, )^2*Math.sqrt(x^3)正如我之前所说的,应该是pow(x,2)*Math.sqrt(pow(x,3)). 谢谢!!

4

1 回答 1

-1

正如其他人所评论的那样,正则表达式不是要走的路。您应该使用解析器。但是,如果您想要一些快速而肮脏的东西:

匹配器

Capturing groups are indexed from left to right, starting at one. 
Group zero denotes the entire pattern, so the expression m.group(0)
is equivalent to m.group().

所以你需要使用m.group(1)and m.group(2)。并在您的正则表达式中转义插入符号^

import java.util.regex.*;

public class Replace {
    public static void main(String[] args) {
        String function=  "x^2*sqrt(3x)";
        Pattern p = Pattern.compile("([a-z0-9]*)\\^([0-9]*)");
        Matcher m = p.matcher(function);
        String out = function;

        if (m.find())   {
            System.out.println("GRUPO 0:" + m.group(1));
            System.out.println("GRUPO 1:" + m.group(2));
            out = m.replaceFirst("pow(" + m.group(1) + ", " + m.group(2) + ')');
        }
        String funcformat = out;
        funcformat = funcformat.replaceAll("sqrt\\(([a-z0-9]*)\\^([0-9]*)]*\\)", "Math.sqrt(pow($1, $2))"); 
        System.out.println("Return Value :"+ function );
        System.out.print("Return Value :"+ funcformat );
    }
}
于 2013-05-16T21:08:55.653 回答