保持正则表达式匹配和它们之间的文本

时间:2014-10-03 10:53:25

标签: javascript regex regex-greedy

我试图在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&#39;”则会遇到问题,这是由于&#39; \ S +&#39;给了我一个单独的部分&#39;!#$ 123 + 456&#39;,它应该是&#39;!#$&#39;,&#39; 123&#39;,&#39; +&# 39;,&#39; 456&#39;

我可以将其他内容设置为&#39; \ S&#39;但这将是&#39;!&#39;,&#39;#&#39;&#39; $&#39 ;,&#39; 123&#39;,&#39; +&#39;,&#39; 456&#39;,但我更愿意保留所有&#34;其他&#34;一起输入模式。

保持&#34;其他&#34;的最佳方法是什么?类型模式在一起?或者有没有办法让我放弃&#34;其他&#34;模式并让正则表达式返回匹配的模式和它们之间的所有文本?

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用先行断言,这样只有在没有别的情况下它才会匹配:

(
    (?!(!|=|<|>)=|[=<>()^\\/*+-]) // this is the pattern for "operator", enclosed in a negative lookahead
    (?!(\\d+\\.?\\d*|\\.\\d+)([eE][-+]?\\d+)?) // the pattern for "number"...
    (?![A-Za-z](_?[A-Za-z0-9]+)*) // "variable"...
    (?!,) // "separator"...
    (?!\s) // "whitespace"
    . // no other pattern matches, so it's ok to consume the next character.
)* // repeat this as often as possible.

另一个解决方案是根本不匹配other字符,按照以下方式做一些事情:

var match_index= 0;
while ((match = pattern.exec(equation_string)) !== null)
{
    if(match.index > match_index)
    {
        var other= equation_string.substring(match_index, match.index);
        alert(other);
    }
    match_index= pattern.lastIndex;
}
if (match_index < equation_string.length){
    var other= equation_string.substring(match_index);
    alert(other);
}
// result: "!#$"