我想使用正则表达式验证数学表达式。数学表达式可以是这个
可以为空白表示未输入任何内容
如果指定,它将始终以运营商+
或-
或*
或/
开头,并且后面始终会跟一个可以拥有的号码
任意数量的数字和数字可以是十进制(数字之间包含.
)或整数(数字中没有'。'符号)。
示例:*0.9
,+22.36
,- 90
,/ 0.36365
然后可以接着是第2点(上面一行)中提到的内容。
示例:*0.9+5
,+22.36*4/56.33
,-90+87.25/22
,/0.36365/4+2.33
请帮帮我。
答案 0 :(得分:18)
这样的事情应该有效:
^([-+/*]\d+(\.\d+)?)*
^
- 字符串的开头[-+/*]
- 其中一个运营商\d+
- 一个或多个数字(\.\d+)?
- 一个可选的点后跟一个或多个数字()*
- 整个表达重复零次或多次答案 1 :(得分:0)
如果你想要消极或积极的表达,你可以像这样写>
^\-?[0-9](([-+/*][0-9]+)?([.,][0-9]+)?)*?$
还有第二个
^[(]?[-]?([0-9]+)[)]??([(]?([-+/*]([0-9]))?([.,][0-9]+)?[)]?)*$
在表达式中使用括号但不计算数字,您将需要验证它或正则表达式的方法。 //方法
public static bool IsPairParenthesis(string matrixExpression)
{
int numberOfParenthesis = 0;
foreach (char character in matrixExpression)
{
if (character == '(')
{
numberOfParenthesis++;
}
if (character == ')')
{
numberOfParenthesis--;
}
}
if (numberOfParenthesis == 0)
{ return true; }
return false;
}
答案 2 :(得分:-1)
这是Java正则表达式,但这仅在没有大括号的情况下
[+\-]?(([0-9]+\.[0-9]+)|([0-9]+\.?)|(\.?[0-9]+))([+\-/*](([0-9]+\.[0-9]+)|([0-9]+\.?)|(\.?[0-9]+)))*
这也用Java代码中的花括号
在这种情况下,我将(..)
放在数字(..)上,应该匹配而不用大括号模式
// without brace pattern
static Pattern numberPattern = Pattern.compile("[+\\-]?(([0-9]+\\.[0-9]+)|([0-9]+\\.?)|(\\.?[0-9]+))([+\\-/*](([0-9]+\\.[0-9]+)|([0-9]+\\.?)|(\\.?[0-9]+)))*");
static Pattern bracePattern = Pattern.compile("\\([^()]+\\)");
public static boolean matchesForMath(String txt) {
if (txt == null || txt.isEmpty()) return false;
txt = txt.replaceAll("\\s+", "");
if (!txt.contains("(") && !txt.contains(")")) return numberPattern.matcher(txt).matches();
if (txt.contains("(") ^ txt.contains(")")) return false;
if (txt.contains("()")) return false;
Queue<String> toBeRematch = new ArrayDeque<>();
toBeRematch.add(txt);
while (toBeRematch.size() > 0) {
String line = toBeRematch.poll();
Matcher m = bracePattern.matcher(line);
if (m.find()) {
String newline = line.substring(0, m.start()) + "1" + line.substring(m.end());
String withoutBraces = line.substring(m.start() + 1, m.end() - 1);
toBeRematch.add(newline);
if (!numberPattern.matcher(withoutBraces).matches()) return false;
}
}
return true;
}