Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中匹配此正则表达式_Javascript_Regex - Fatal编程技术网

如何在javascript中匹配此正则表达式

如何在javascript中匹配此正则表达式,javascript,regex,Javascript,Regex,我正试图找到一种方法来解决这个问题,但我迷路了 我希望它匹配一个数学方程,该方程将接受字符串,如果: “+-*/%”位于字符串中的任意位置,但不在输入字符串的最后一个字符中 它接受浮点和整数 它不接受字母,只接受数字和符号 有什么帮助吗 提前谢谢 您要查找的正则表达式如下所示: -?\d+(?:\.\d+)?([*/%+-]-?\d+(?:\.\d+)?)+ 基本上这意味着: NUMBER (OPER NUMBER)* 数字定义为: 可选减号 一个或多个数字 (可选)后跟一个或多个数字

我正试图找到一种方法来解决这个问题,但我迷路了

我希望它匹配一个数学方程,该方程将接受字符串,如果:

  • “+-*/%”位于字符串中的任意位置,但不在输入字符串的最后一个字符中
  • 它接受浮点和整数
  • 它不接受字母,只接受数字和符号
有什么帮助吗


提前谢谢

您要查找的正则表达式如下所示:

-?\d+(?:\.\d+)?([*/%+-]-?\d+(?:\.\d+)?)+
基本上这意味着:

NUMBER (OPER NUMBER)*
数字定义为:

  • 可选减号
  • 一个或多个数字
  • (可选)后跟一个或多个数字的句点
现在,前面的可选负号并不严格符合您的要求,因此您可以安全地删除它,但如果没有它,您将无法识别:

-3*-4
这违反了两个操作数同时存在的条件。要删除它,只需从表达式(两处)中删除
-?
,即:

还不清楚是要接受多个操作数,还是只接受一个操作数。如果只有一个,那么:

-?\d+(?:\.\d+)?[*/%+-]-?\d+(?:\.\d+)?

或允许空格的变体(
\s
)。您可能还希望使用括号捕获组

您可能需要更改该定义

也可以考虑在数字和操作数之间设置空格。< /P> 用法示例:

var s = "-11.32 * -34";
var r = /(-?\d+(?:\.\d+)?)\s*([*/%+-])\s*(-?\d+(?:\.\d+)?)/;
var m = r.exec(s);
if (m != null) {
  alert("First: " + m[1] + "\nOperand: " + m[2] + "\nSecond: " + m[3]);
} else {
  alert("Not found");
}

编辑以回答修改后的问题

  • 数字:
    [0-9]
  • 编号:
    [0-9]+
  • 带可选小数部分的数字:
    [0-9]+(?:\[0-9]+)?
  • 其中一个数字前面可选地加上一个操作:
    ([-+/%*])?([0-9]+(?:\.[0-9]+)?)
  • 上面的一个,后跟零个或多个操作+数字对:
    ([-+/%*])?([0-9]+(?:\.[0-9]+)([-+/%*])([0-9]+(?:\.[0-9]+)?)*
这不是一个真正的方程,因为没有=符号


在上述任何一种情况下,您都可以将
[0-9]
替换为\d。我有一个明确指定范围的习惯,因为emacs不做\d.

(\d+(\.\d+))([*/%+-]\d+(\.\d+))*
可能更可取/(\d+)([*/%+-]\d+(\.\d+)+/,但首先它接受了“+-”,也接受了“+100-”,非常感谢guysbeauty和regexp的永不合作:)
\d+(?:\.\d+)?[*/%+-]\d+(?:\.\d+)?
var s = "-11.32 * -34";
var r = /(-?\d+(?:\.\d+)?)\s*([*/%+-])\s*(-?\d+(?:\.\d+)?)/;
var m = r.exec(s);
if (m != null) {
  alert("First: " + m[1] + "\nOperand: " + m[2] + "\nSecond: " + m[3]);
} else {
  alert("Not found");
}