四则运算的正则校验

文章目录

场景:我们选取变量,变量使用${} 或者#{}包裹起来,然后可以四则运算(±*/和括号),需要校验正确性

javascript 复制代码
(${ACinterU} + ${ACTdisV1bh}) + ${ALMfdPD} + #{IndustrialInternetLogo}*4 - 1

四则运算的正则校验

以下是一个简单的四则运算正则校验表达式:

javascript 复制代码
/^\d+(\.\d+)?[\+\-\*\/]\d+(\.\d+)?$/

解释:

^ 表示匹配字符串的开头。

\d+ 表示匹配一个或多个数字。

(.\d+)? 表示匹配一个小数点和一个或多个数字,这部分内容可以出现零次或一次。

+-\*/ 表示匹配加号、减号、乘号或除号。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

1+2

3.14-2.7

10*5.2

100/20.5

需要注意的是,这个正则表达式只能校验基本的四则运算格式,不能校验运算的正确性。例如,1/0 这样的除零运算也可以通过正则校验。

带有变量的四则运算的正则校验

正则表达式无法直接校验带有变量的四则运算表达式,因为变量的名称和取值是不确定的,无法用固定的模式匹配。

如果需要校验带有变量的四则运算表达式,可以考虑先将变量替换成一个占位符,比如 x,然后再进行正则校验。具体步骤如下:

将变量替换成一个占位符,比如 x。

例如,将表达式 a + b * 2 - c / d 替换成 x + x * 2 - x / x。

使用正则表达式校验替换后的表达式。

例如,使用上面提到的正则表达式 /^\d+(.\d+)?+-\*/\d+(.\d+)?$/ 进行校验。

如果替换后的表达式通过了正则校验,再将占位符替换回原来的变量名称。

例如,将 x + x * 2 - x / x 替换回 a + b * 2 - c / d。

需要注意的是,这种方法只能校验变量名称是否合法,不能校验变量的取值是否合法。如果需要校验变量的取值是否合法,需要使用编程语言的语法分析功能。

带有括号的四则运算的正则校验

正则表达式可以校验带有括号的四则运算表达式,以下是一个简单的正则表达式:

javascript 复制代码
/^(\d+(\.\d+)?|\([^\(\)]+\))(\s*[\+\-\*\/]\s*(\d+(\.\d+)?|\([^\(\)]+\)))*$/

该正则表达式可以匹配以下类型的表达式:

1+2

3.14 - 2.7 * (5 + 2)

(10 - 5) * 2

5 / (2 + 1) - 1

正则表达式的含义:

^ 表示匹配字符串的开头。

( 表示开始一个分组。

\d+(.\d+)? 表示匹配一个或多个数字和一个可选的小数点和一个或多个数字。

| 表示或者。

(\^()+) 表示匹配一个左括号、一个或多个非括号字符、一个右括号。

) 表示结束一个分组。

(\s*+-\*/\s*(\d+(.\d+)?|(\^()+)))* 表示匹配一个或多个空格、一个加号、减号、乘号或除号、一个或多个空格、一个数字或括号表达式。

$ 表示匹配字符串的结尾。

需要注意的是,这个正则表达式只能校验基本的四则运算格式,不能校验运算的正确性。例如,1/0 这样的除零运算也可以通过正则校验。

变量使用${}包裹的四则运算正则表达式

以下是一个变量使用${}包裹的四则运算正则表达式:

javascript 复制代码
/^\s*\${[a-zA-Z]+\s*}(\s*[\+\-\*\/]\s*\${[a-zA-Z]+\s*})*(\s*[\+\-\*\/]\s*\d+(\.\d+)?)*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

{\[a-zA-Z\]+\\s\*} 表示匹配一个变量,变量的格式为{变量名}。

(\s*+-\*/\s*${a-zA-Z+\s*})* 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量和零个或多个空格的组合,这部分内容可以出现零次或多次。

(\s*+-\*/\s*\d+(.\d+)?)* 表示匹配一个加号、减号、乘号或除号,后面跟着一个数字和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

javascript 复制代码
${a} + ${b} * 2 - ${c} / ${d} 
${foo} - ${bar} * 5.5 + ${baz} / 6

需要注意的是,这个正则表达式只能校验变量和数字的基本格式,不能校验运算的正确性。例如,1/0 这样的除零运算也可以通过正则校验。同时,该正则表达式只支持${}格式的变量,不支持其他格式的变量。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量使用${}包裹的可以有括号的四则运算正则表达式

以下是一个变量使用${}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*(\${[a-zA-Z]+\s*}|\(\s*[\+\-\*\/]?\s*(\${[a-zA-Z]+\s*}|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*(\${[a-zA-Z]+\s*}|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*(\${[a-zA-Z]+\s*}|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*(\${[a-zA-Z]+\s*}|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

({\[a-zA-Z\]+\\s\*}\|(\\s\*\[+-\*/\]?\\s\*({a-zA-Z+\s*}|\d+(.\d+)?|(\s*+-\*/?\s*({\[a-zA-Z\]+\\s\*}\|\\d+(.\\d+)?)+\\s\*)\\s\*)+\\s\*)) 表示匹配一个变量或括号内的四则运算表达式,变量的格式为{变量名}。

(\s*+-\*/\s*({\[a-zA-Z\]+\\s\*}\|\\d+(.\\d+)?\|(\\s\*\[+-\*/\]?\\s\*({a-zA-Z+\s*}|\d+(.\d+)?)+\s*)))* 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

a + ( {a} + ( a+({b} * 2) - ({c} / {d})
f o o − ( {foo} - ( foo−({bar} * 5.5 + ${baz}) / (6 + q u x ) 需要注意的是,这个正则表达式只能校验变量和数字的基本格式,不能校验运算的正确性。例如, 1 / 0 这样的除零运算也可以通过正则校验。同时,该正则表达式只支持 {qux}) 需要注意的是,这个正则表达式只能校验变量和数字的基本格式,不能校验运算的正确性。例如,1/0 这样的除零运算也可以通过正则校验。同时,该正则表达式只支持 qux)需要注意的是,这个正则表达式只能校验变量和数字的基本格式,不能校验运算的正确性。例如,1/0这样的除零运算也可以通过正则校验。同时,该正则表达式只支持{}格式的变量,不支持其他格式的变量。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量使用#{}包裹的可以有括号的四则运算正则表达式

以下是一个变量使用#{}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*(#\{[a-zA-Z]+\s*\}|\(\s*[\+\-\*\/]?\s*(#\{[a-zA-Z]+\s*\}|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*(#\{[a-zA-Z]+\s*\}|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*(#\{[a-zA-Z]+\s*\}|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*(#\{[a-zA-Z]+\s*\}|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

(#{a-zA-Z+\s*}|(\s*+-\*/?\s*(#{a-zA-Z+\s*}|\d+(.\d+)?|(\s*+-\*/?\s*(#{a-zA-Z+\s*}|\d+(.\d+)?)+\s*)\s*)+\s*)) 表示匹配一个变量或括号内的四则运算表达式,变量的格式为#{变量名}。

(\s*+-\*/\s*(#{a-zA-Z+\s*}|\d+(.\d+)?|(\s*+-\*/?\s*(#{a-zA-Z+\s*}|\d+(.\d+)?)+\s*)))* 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

#{a} + (#{b} * 2) - (#{c} / #{d})

#{foo} - (#{bar} * 5.5 + #{baz}) / (6 + #{qux})

需要注意的是,这个正则表达式只能校验变量和数字的基本格式,不能校验运算的正确性。例如,1/0 这样的除零运算也可以通过正则校验。同时,该正则表达式只支持#{}格式的变量,不支持其他格式的变量。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量使用${}或者 #{}包裹的可以有括号的四则运算正则表达式

以下是一个变量使用${}或者#{}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*((\${[a-zA-Z]+\s*}|\#\{[a-zA-Z]+\s*\})|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z]+\s*}|\#\{[a-zA-Z]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z]+\s*}|\#\{[a-zA-Z]+\s*\})|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*((\${[a-zA-Z]+\s*}|\#\{[a-zA-Z]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z]+\s*}|\#\{[a-zA-Z]+\s*\})|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

(({\[a-zA-Z\]+\\s\*}\|#{\[a-zA-Z\]+\\s\*})\|(\\s\*\[+-\*/\]?\\s\*(({a-zA-Z+\s*}|#{a-zA-Z+\s*})|\d+(.\d+)?|(\s*+-\*/?\s*(({\[a-zA-Z\]+\\s\*}\|#{\[a-zA-Z\]+\\s\*})\|\\d+(.\\d+)?)+\\s\*)\\s\*)+\\s\*)) 表示匹配一个变量或括号内的四则运算表达式,变量的格式为{变量名}或#{变量名}。

(\s*+-\*/\s*(({\[a-zA-Z\]+\\s\*}\|#{\[a-zA-Z\]+\\s\*})\|\\d+(.\\d+)?\|(\\s\*\[+-\*/\]?\\s\*(({a-zA-Z+\s*}|#{a-zA-Z+\s*})|\d+(.\d+)?)+\s*)))* 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

KaTeX parse error: Expected 'EOF', got '#' at position 8: {a} + (#̲{b} * 2) - ({c} / #{d})

#{foo} - (${bar} * 5.5 + KaTeX parse error: Expected 'EOF', got '#' at position 15: {baz}) / (6 + #̲{qux}) 需要注意的是,这...{}和#{}格式的变量,如果需要只支持其中一种格式,可以将正则表达式中对应的部分删除。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量支持数字、字母和-_ 使用${}或者 #{}包裹的可以有括号的四则运算正则表达式

以下是一个变量支持数字、字母和-_,使用${}或者#{}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*((\${[a-zA-Z0-9\-_]+\s*}|\#\{[a-zA-Z0-9\-_]+\s*\})|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_]+\s*}|\#\{[a-zA-Z0-9\-_]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_]+\s*}|\#\{[a-zA-Z0-9\-_]+\s*\})|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*((\${[a-zA-Z0-9\-_]+\s*}|\#\{[a-zA-Z0-9\-_]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_]+\s*}|\#\{[a-zA-Z0-9\-_]+\s*\})|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

(({\[a-zA-Z0-9-*\]+\\s\*}\|#{\[a-zA-Z0-9-* \]+\\s\*})\|(\\s\*\[+-\*/\]?\\s\*(({a-zA-Z0-9-*+\s*}|#{a-zA-Z0-9-* +\s*})|\d+(.\d+)?|(\s*+-\*/?\s*(({\[a-zA-Z0-9-*\]+\\s\*}\|#{\[a-zA-Z0-9-* \]+\\s\*})\|\\d+(.\\d+)?)+\\s\*)\\s\*)+\\s\*)) 表示匹配一个变量或括号内的四则运算表达式,变量的格式为{变量名}或#{变量名},变量名可以包含数字、字母和-*。
(\s*+-\*/\s*(({\[a-zA-Z0-9-* \]+\\s\*}\|#{\[a-zA-Z0-9-*\]+\\s\*})\|\\d+(.\\d+)?\|(\\s\*\[+-\*/\]?\\s\*(({a-zA-Z0-9-* +\s*}|#{a-zA-Z0-9-_+\s*})|\d+(.\d+)?)+\s*)))* 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

KaTeX parse error: Expected 'EOF', got '#' at position 12: {a_1-2} + (#̲{b-3} * 2) - ({c_4} / #{d_5})

#{foo} - (${bar} * 5.5 + KaTeX parse error: Expected 'EOF', got '#' at position 19: ...z_6-7}) / (6 + #̲{qux_8}) 需要注意的是...{}和#{}格式的变量,如果需要只支持其中一种格式,可以将正则表达式中对应的部分删除。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量支持大小写字母,数字和特殊字符"_?'#().,&%@!-" 使用${}或者 #{}包裹的可以有括号的四则运算正则表达式

以下是一个变量支持大小写字母、数字和特殊字符_?'#().,&%@!-,使用${}或者#{}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*((\${[a-zA-Z0-9_?'#()\.,&%@!\-]+}|\#\{[a-zA-Z0-9_?'#()\.,&%@!\-]+\})|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9_?'#()\.,&%@!\-]+}|\#\{[a-zA-Z0-9_?'#()\.,&%@!\-]+\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9_?'#()\.,&%@!\-]+}|\#\{[a-zA-Z0-9_?'#()\.,&%@!\-]+\})|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*((\${[a-zA-Z0-9_?'#()\.,&%@!\-]+}|\#\{[a-zA-Z0-9_?'#()\.,&%@!\-]+\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9_?'#()\.,&%@!\-]+}|\#\{[a-zA-Z0-9_?'#()\.,&%@!\-]+\})|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

({\[a-zA-Z0-9_?'#().,\&%@!-\]+}\|#{\[a-zA-Z0-9_?'#().,\&%@!-\]+}) 表示匹配一个变量,变量的格式为{变量名}或#{变量名},变量名可以包含大小写字母、数字和特殊字符_?'#().,&%@!-。

(\s*+-\*/\s*(({\[a-zA-Z0-9_?'#().,\&%@!-\]+}\|#{\[a-zA-Z0-9_?'#().,\&%@!-\]+})\|\\d+(.\\d+)?\|(\\s\*\[+-\*/\]?\\s\*(({a-zA-Z0-9_?'#().,\&%@!-+}|#{a-zA-Z0-9_?'#().,\&%@!-+})|\d+(.\d+)?)+\s*)\s*)+\s*)) 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

这个正则表达式可以匹配类似于以下格式的字符串:

KaTeX parse error: Expected 'EOF', got '#' at position 11: {a_1-2} + #̲{b-3} * 2 - ({c_4} / #{d_5})

#{foo} - (${bar} * 5.5 + KaTeX parse error: Expected 'EOF', got '#' at position 19: ...z_6-7}) / (6 + #̲{qux_8}) 需要注意的是...{}和#{}格式的变量,如果需要只支持其中一种格式,可以将正则表达式中对应的部分删除。如果需要支持其他格式的变量,建议使用编程语言的语法分析功能。

变量支持大小写字母,数字和特殊字符 使用${}或者 #{}包裹的可以有括号的四则运算正则表达式

以下是一个变量支持大小写字母、数字和特殊字符,使用${}或者#{}包裹的可以有括号的四则运算正则表达式:

javascript 复制代码
/^\s*((\${[a-zA-Z0-9\-_@#$%^&*()]+\s*}|\#\{[a-zA-Z0-9\-_@#$%^&*()]+\s*\})|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_@#$%^&*()]+\s*}|\#\{[a-zA-Z0-9\-_@#$%^&*()]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_@#$%^&*()]+\s*}|\#\{[a-zA-Z0-9\-_@#$%^&*()]+\s*\})|\d+(\.\d+)?)+\s*\)\s*)+\s*\))(\s*[\+\-\*\/]\s*((\${[a-zA-Z0-9\-_@#$%^&*()]+\s*}|\#\{[a-zA-Z0-9\-_@#$%^&*()]+\s*\})|\d+(\.\d+)?|\(\s*[\+\-\*\/]?\s*((\${[a-zA-Z0-9\-_@#$%^&*()]+\s*}|\#\{[a-zA-Z0-9\-_@#$%^&*()]+\s*\})|\d+(\.\d+)?)+\s*\)))*\s*$/

解释:

^ 表示匹配字符串的开头。

\s* 表示匹配零个或多个空格。

({\[a-zA-Z0-9-*@# %\^\&\*()\]+\\s\*}\|\\#\\{\[a-zA-Z0-9\\-_@# %\^\&*()\]+\\s* }) 表示匹配一个变量,变量的格式为{变量名}或#{变量名},变量名可以包含大小写字母、数字和特殊字符- _ @ # % \^ \& \* ( )。 (\\s\*\[+-\*/\]\\s\*(({a-zA-Z0-9-* @# %\^\&\*()+\s*}|\#\{a-zA-Z0-9\\-_@# %^\&\*()+\s*})|\d+(.\d+)?|(\s*+-\*/?\s*(({\[a-zA-Z0-9-_@#%^&*()]+\s*}|#{a-zA-Z0-9-_@#$%^\&*()+\s* })|\d+(.\d+)?)+\s*)\s*)+\s*)) 表示匹配一个加号、减号、乘号或除号,后面跟着一个变量或数字或括号内的四则运算表达式和零个或多个空格的组合,这部分内容可以出现零次或多次。

$ 表示匹配字符串的结尾。

JS使用正则表达式获取${} 里面的内容

可以使用正则表达式来获取 ${} 中的内容。下面是一个示例代码:

javascript

javascript 复制代码
var str = 'hello ${name}, your age is ${age}';
var pattern = /\${(.*?)}/g;
var matches = str.match(pattern);
for (var i = 0; i < matches.length; i++) {
  var match = matches[i];
  var value = match.substring(2, match.length - 1);
  console.log(value);
}

在上面的代码中,我们使用了正则表达式 /${(.*?)}/g 来匹配

中的内容。该正则表达式中的(.∗?)表示一个非贪婪匹配,即尽可能少地匹配字符。其中,

中的内容。该正则表达式中的(.∗?)表示一个非贪婪匹配,即尽可能少地匹配字符。其中,{} 表示匹配 和之间的字符, { 和 } 之间的字符, 和之间的字符,{} 中的 \ 表示转义字符,用于匹配 ${ 和 } 字符本身。

然后,我们使用 String 对象的 match() 方法来查找所有匹配的内容,并使用 for 循环遍历 matches 数组,获取每个匹配项的值。由于匹配项包含 ${ 和 } 字符,因此我们需要使用 substring() 方法来截取中间的内容,即 match.substring(2, match.length - 1),最后输出获取到的值。

需要注意的是,如果 ${} 中的内容包含了换行符等特殊字符,上述代码可能会出现错误。在这种情况下,可以使用正则表达式的 s 标志来匹配包括换行符在内的所有字符,例如:

javascript

var pattern = /${(\\s\\S*?)}/g;

这样就可以匹配 ${} 中的所有字符,包括换行符在内。

参考:https://blog.csdn.net/qq_40830369/article/details/132060048

注:gpt

相关推荐
必须会一定会6 小时前
用纯 HTML/JS 做一个 AI 需求澄清器:把模糊想法转换成可执行任务书
开发语言·前端·javascript·人工智能·html·ai编程
小帅不太帅6 小时前
1.5M 参数的 OCR 模型,我把它跑进了浏览器
前端·javascript·ai编程
avi911119 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen19 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
用户9385156350720 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
油丶酸萝卜别吃20 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang20 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方21 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript
汉堡大王95271 天前
Vue 3 + TS + Element Plus 实战:如何从零搭建企业级违章记录管理 SaaS 前端
前端·javascript·vue.js
海天鹰1 天前
屏幕颜色检测
javascript·html5