替换字符串中的符号

时间:2015-09-29 14:12:13

标签: java

如何将^替换为调用Math.pow()? 例如:

public void MultiThreadMet (object IndexForSearch)
{                
    int index = (int)IndexForSearch;

    while (isRunningForSearch)
    {
        try
        {
            if (index >= dataUrlList.Rows.Count)
            {
                return;
            }

            DataGridViewRow row = dataUrlList.Rows[index];
            index++;

            //For just test i'm trying to add "test" in every cell[1] in datagridview
            dataUrlList.Invoke(new Action(() => row.Cells[1].Value = "test"));
        }
        catch
        {
        }                           
    }
}

3 个答案:

答案 0 :(得分:1)

你可以这样做:

str = str.replaceAll("\\(?(\\d+\\.?\\d*)\\)?\\^\\(?(\\d+\\.?\\d*)\\)?", "Math.pow($1,$2)");

在这种情况下,您正在寻找2组数字(\\d+\\.?\\d*),它们可以是浮点值,可以在()\\(?\\)?内。在这两组之间,你需要有^符号\\^。如果匹配,则replaceAll方法将所有此模式替换为Math.pow($1,$2),其中$ 1和$ 2将替换为第一组和第二组数字。

但有一点,如果你有一个复杂的表达式,连续2次乘法,如10.22^31.22^5,可能会导致错误的结果。在这种情况下,这个正则表达式应该复杂得多。也许你应该使用其他算法来解析这些表达式。

答案 1 :(得分:0)

您可以使用java中的正则表达式执行此操作。 使用下面的代码段来分隔和替换字符串。

private static String replaceMatchPow(String pValue) {
    String regEx = "(\\d*\\.*\\d*)\\^\\(*(\\d*\\.*\\d*)\\)*";
    Pattern pattern = Pattern.compile(regEx);
    Matcher m = pattern.matcher(pValue);
    if (m.find()) {
        String value = "Math.pow(" + m.group(1) + "," + m.group(2) + ")";
        pValue = pValue.replaceAll(regEx, value);
    }
    return pValue;
}

正则表达式如何运作? 以下是输入" 2 ^(12)+ 6"的示例。 第一组(\ d * \。 \ d
\ d * - >匹配数字[0-9], * - >零到无限 \ ^ - >用^符号划分组 (* - >左括号,*表示出现零到无限制 第二组(\ d * \。 \ d
)* - >右括号

结果:第一组值为2,第二组值为12


/(\d*.*\d*)\^(*(\d*.*\d*))*/
第一个捕获组(\ d *。* \ d *)
\ d *匹配一个数字[0-9]
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
。*匹配角色。按照字面
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
\ d *匹配一个数字[0-9]
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
\ ^字面上匹配字符^
(*匹配字符(字面意思)
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
第二个捕获组(\ d *。* \ d *)
\ d *匹配一个数字[0-9]
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
。*匹配角色。按照字面
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
\ d *匹配一个数字[0-9]
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]
)*字面上匹配字符
量词:*在零和无限次之间,尽可能多次,根据需要回馈[贪心]

答案 2 :(得分:0)

对于您的特殊问题,您应该在Java regular expressions中查找脱字符号^如何转义,它应该是\^

请注意:

  

解释Java源代码中字符串文字中的反斜杠   按照Java™语言规范的要求,作为Unicode   逃避(第3.3节)或其他角色逃脱(第3.10.6节)   因此有必要在字符串文字中加倍反斜杠   代表正则表达式,以保护他们免受解释   Java字节码编译器。

因此,您最终将"\\^"作为Java String

但是一般来说,你会为算术表达式编写一个解析器和解释器。

该主题称为编译器构造,依赖于有限自动机和形式语言的知识。

一个很好的例子可以在Bjarne Stroustrup的“The C ++ Programming Language,Fourth Edition”的第10.2章“A Desk Calculator”中找到。 (是的,我知道你想用Java编写代码,请继续阅读)。 它具有这种形式语法:

program:
  end //end is end-of-input
  expr_list end

expr_list:
  expression print  //pr intis newline or semicolon
  expression print expr_list

expression:
  expression + term
  expression − term
  term

term:
  term / primary
  term ∗ primary
  primary

primary:
  number //number is a floating-point literal
  name //name is an identifier
  name = expression
  −primary
  ( expression )

Stroustrup向您展示了如何以类似的结构对其进行编码:

double expr(bool get) //add and subtract
{
  double left = term(get);
  for(;;) { //‘‘forever’’
    switch(ts.current().kind) {
    case Kind::plus:
      left += term(true);
      break;
    case Kind::minus:
      left −= term(true);
      break;
    default:
      return left;
    }
  }
}

这段代码体现了语法的这一部分:

expression:
  expression + term
  expression − term
  term

这种技术称为递归下降,因为语法中的递归将在相应的代码中实现为递归函数调用。具体的相关C ++代码也应该是Java开发人员可以理解的。

一旦你熟悉了语法以及如何实现它们, 见例如Unambiguous grammar for exponentiation operation 如何以这种方式处理取幂,通常的运算符优先级规则得到满足。