如何用正则表达式匹配算术表达式中的多词变量(排除运算符与数字)
正则表达式解决方案
需求1:匹配包含数字在内的所有目标内容
针对示例表达式(Car speed / Road-congestion Time) + 100,要匹配得到Car speed、Road-congestion Time、100,可使用以下正则:
(?<![^\s+*/()])[^+*/()\s](?:[^+*/()]*[^+*/()\s])?(?![^\s+*/()])
正则说明
(?<![^\s+*/()]):前置断言,确保匹配内容的前导是运算符(+*/())、空格或字符串开头,避免把变量内的连字符误判为分隔符[^+*/()\s]:匹配第一个非运算符、非空格的字符,直接排除空匹配的可能(?:[^+*/()]*[^+*/()\s])?:可选匹配后续的非运算符字符,最终以非空格、非运算符字符结尾,避免捕获多余的尾随空格(?![^\s+*/()]):后置断言,确保匹配内容的后续是运算符(+*/())、空格或字符串结尾,同样避免误判变量内的连字符
需求2:仅匹配变量,忽略数字
如果需要排除纯数字(仅得到Car speed、Road-congestion Time),可在上述正则基础上添加纯数字排除逻辑:
(?<![^\s+*/()])(?!\d+(?:\.\d+)?$)[^+*/()\s](?:[^+*/()]*[^+*/()\s])?(?![^\s+*/()])
新增逻辑说明
(?!\d+(?:\.\d+)?$):负向预查,确保当前匹配的内容不是纯整数或小数,从而过滤掉数字类匹配结果
原正则问题分析
你之前使用的[+-\*\/()]?([^+-\*\/()]*)[+-\*\/()]?存在两个核心问题:
- 由于运算符部分是可选的,会匹配到表达式首尾或运算符之间的空内容,导致出现空匹配
- 将所有减号(包括变量内的连字符)都当作分隔符,无法区分作为运算符的减号(前后带空格)和变量内的连字符(无空格)
内容的提问来源于stack exchange,提问作者Sig
相关产品推荐
相关产品推荐

