【发布时间】:2014-10-03 10:53:24
【问题描述】:
我正在尝试在 javascript 中创建一个方程解析器,因此我使用正则表达式将方程分解为各个部分。这是我目前正在使用的正则表达式:
var equation_string = '!#$123+456';
var operator = '(!|=|<|>)=|[=<>()^\\/*+-]';
var number = '(\\d+\\.?\\d*|\\.\\d+)([eE][-+]?\\d+)?';
var variable = '[A-Za-z](_?[A-Za-z0-9]+)*';
var separator = ',';
var other = '\\S+';
var whitespace = '\\s+';
var pattern = new RegExp(number+'|'+operator+'|'+variable+'|'+separator+'|'+other+'|'+whitespace, 'g');
var equation_parts = equation_string.match(pattern);
我想保留等式的所有部分(用于跟踪我需要在等式中突出显示的位置,如果它格式不正确)。但是如果用户输入说'!#$ 123 + 456'会遇到问题,因为'\ S +'给了我一个部分'!#$ 123 + 456',而它应该是'!#$ ','123','+','456'.
我可以将 other 设置为 '\S',但这将是 '!'、'#'、'$'、'123'、'+'、'456',但我更愿意保留所有“其他”类型的模式。
将“其他”类型模式保持在一起的最佳方式是什么?或者有没有办法让我放弃“其他”模式并让正则表达式返回匹配的模式和它们之间的所有文本?
【问题讨论】:
-
我的直觉是更改 other 以明确禁止其他正则表达式中的所有内容。
-
将
other设置为\S也是我对这个问题的回答,因为它会在每个位置有效地检查它是否是一个有效的标记,然后再获取字符。否则,您必须在负前瞻中复制number|operator|variable|separator才能获得相同的结果。 -
我想过否定所有其他模式,但希望有一个优雅的替代方案。如果没有,那么我可能只会使用 '\S'。
标签: javascript regex regex-greedy