正则表达式实施偶数奇数的负号

时间:2015-08-03 11:47:11

标签: javascript regex math

我想在JavaScript中编写一个.replace函数,在代数中实现偶数奇数的负号。在一系列消极和积极的迹象中:

  • 案例1 :如果出现奇数个负号,则相当于否定号
  • 案例2 :如果出现偶数个负号,则相当于正号。

然后我会.replace(/regex for case1/, "-").replace(/regex for case2/, "+")。关于如何做到这一点的任何想法?

以下是示例字符串:

  • \frac{a^{n+-m}}{b} - > \frac{a^{n-m}}{b}
  • abc+cde=ghj--+--hsnj - > abc+cde=ghj+hsnj

5 个答案:

答案 0 :(得分:1)

对于奇数个连字符的

([^-+]|^)(?:[+]*-[+]*-)*[+]*-[+]*([^+-]),如https://regex101.com/r/fU0vY7/4所示,需要替换为$1-$2

([^-+]|^)(?:[+]*-[+]*-[+]*)+([^+-])对于偶数个连字符,如https://regex101.com/r/fU0vY7/5所示,需要替换为$1+$2

您可以在同一个字符串上使用这两个替换。到目前为止,我测试的所有内容都有效,包括您的示例如果有什么事情发生,请告诉你。

避免捕获组会更方便,但javascript中缺乏lookbehind强迫我添加捕获组并且$1+-$2各自

答案 1 :(得分:1)

正如vks指出的那样,严格来说,正则表达式无法计数。您可以取消Andris's answer中的对,但正如您所看到的,当您覆盖所有案例时,正则表达式会有点长。另一种方法是将正则表达式匹配与正常函数结合起来:

function do_replacement(x) {
    return x.replace(/[+-]+/g,
        function (r) {
            return r.replace(/\+/g, '').length % 2? '-' : '+';
        }
    );
}

这将任务分为两部分:

  1. 使用正则表达式匹配+-
  2. 的任何序列
  3. 在替换功能中,从匹配的字符串中删除+,并计算剩余的字符(由于原始正则表达式,只能是- s)
  4. 根据计数是否为偶数(即+为零)或奇数
  5. ,返回-length % 2

答案 2 :(得分:1)

那么你可以用+替换所有--,然后相应地替换:

expr.replace(/\+/g, '--').replace(/(--)+-/g, '-').replace(/--/g, '+')

或者您可以使用.replace中的函数来计算-的数量:

expr.replace(/[-+]+/g, function(signs){
    return '+-'[signs.replace(/\+/g, '').length % 2];
});

答案 3 :(得分:0)

function replace(str) {
    return str.replace(/[+-]+/g, function(matched, pos, full) {
        // + is 0, - is 1
        // the counting is same as XOR of all +/- signs
        return matched.split('').reduce(function(a,b) {
            return a ^ (b == '-');
        }, 0)
        ? '-'
        : '+';
    });
}

答案 4 :(得分:-1)

Consider a number say x,
get x%2
if x%2!=0, then '-',
else '+'

这只是一种算法。我希望你能从这里得到你的解决方案。