Regex实现偶数负符号规则

Regex to implement even-odd rule of negative signs

本文关键字:符号 规则 实现 Regex      更新时间:2023-09-26

我想用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

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

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

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

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

正如vks所指出的,严格来说,正则表达式不能计数。您可以像Andris的回答中那样取消对,但正如您所看到的,当您涵盖所有情况时,regexp会变得有点长。另一种选择是将正则表达式匹配与一个正常函数结合起来:

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

这将任务分为两部分:

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

([^-+]|^)(?:[+]*-[+]*-)*[+]*-[+]*([^+-])表示奇数个连字符,如图所示https://regex101.com/r/fU0vY7/4,需要更换为$1-$2

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

可以在同一字符串上使用两个替换。到目前为止,我测试的所有东西都有效,包括你的例子。如果有什么不对劲,一定要告诉我。

避免捕获组会更方便,但javascript中缺少lookbacking迫使我分别添加捕获组和$1+-$2

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)
        ? '-'
        : '+';
    });
}
Consider a number say x,
get x%2
if x%2!=0, then '-',
else '+'

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