如何将^替换为调用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
{
}
}
}
答案 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 如何以这种方式处理取幂,通常的运算符优先级规则得到满足。