javascript - 正则表达式单独工作,但与 | 结合使用时不起作用

标签 javascript regex

我正在尝试编写类似 eval() 的东西,以下是一些要求:

if the expression contains non-numeric character other than [+, -, *, /, .],
or [+, -] is followed by [*, /],
or [+, -, *, /] is not proceeded by a numeric  e.g."10-",
or [*, /] is not preceded by a numeric  e.g."-10" is valid, "*10" is not valid
throw an exception

我有以下代码:

if (expression.match(/[^+\-*/\d.]/) ||
    expression.match(/[+-](?=[*/])/) ||
    expression.match(/[+\-*/]($|[^+\-.\d])/) ||
    expression.match(/(^|[^+\-.\d])[*/]/))
    throw errors.ExpressionParserError;

当表达式按照上面的方式分开时,它工作得很好,但是当我将它们与 |(OR) 组合时,它不再抛出异常

if (expression.match(/[^+\-*/\d.] | [+-](?=[*/]) | [+\-*/]($|[^+\-.\d]) | (^|[^+\-.\d])[*/]/))
    throw errors.ExpressionParserError;

例如“d * 1”应该落在表达式的第一部分 [^+-*/\d.]

我在这里错过了什么?谢谢。

最佳答案

有两件事:

  1. | 周围有空格。这些空间很重要。
  2. 您可能需要对各个部分进行分组,以确保正确应用交替(可能对于非捕获组:(?:...))。

例如:

if (expression.match(/(?:[^+\-*/\d.])|(?:[+-](?=[*/]))|(?:[+\-*/]($|[^+\-.\d]))|(?:(^|[^+\-.\d])[*/])/))
// -------------------^^^-----------^^^--------------^^^----------------------^^^-------------------^
    throw errors.ExpressionParserError;

旁注:要测试匹配,请使用 rex.test(str) 而不是 str.match(rex)。如果您的唯一目标是测试匹配,则无需构建结果数组。

关于javascript - 正则表达式单独工作,但与 | 结合使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43798690/

相关文章:

c# - 用正则表达式替换文件 c# 中的字符串

javascript - 如何在 Rails 应用程序中实现 Highcharts 柱形钻取图表?

javascript - 元素类型无效 : undefined - Reactjs

javascript - 使用javascript增加字符串中第3次出现的数字

c - 从C中的文本文件中提取和显示数据

javascript - 如何使用正则表达式分割字符串并仅获取关键部分?

javascript - 将英语数字转换为波斯语

javascript - 多次使用 jquery 对话框,参数略有不同

Java Regex 如何查找字符串是否包含字符但顺序无关紧要

java - myString.replaceAll(regex ,"") 未按预期工作