2015-08-03 94 views
6

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

正则表达式和数学是oxymorons :) – vks

+0

好的。那么,另一个解决方案将是受欢迎的,然后 – guillefix

+0

此外,有什么类似的正则表达式,但数学呢? – guillefix

回答

1

那么你可以用--取代所有+秒,然后相应的替代:

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

或者你可以使用一个函数在.replace数数- s:

expr.replace(/[-+]+/g, function(signs){ 
    return '+-'[signs.replace(/\+/g, '').length % 2]; 
}); 
-1
Consider a number say x, 
get x%2 
if x%2!=0, then '-', 
else '+' 

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

1

([^-+]|^)(?:[+]*-[+]*-)*[+]*-[+]*([^+-])为奇数连字符,因为看到https://regex101.com/r/fU0vY7/4,需要与$1-$2

([^-+]|^)(?:[+]*-[+]*-[+]*)+([^+-])被替换为偶数连字符,因为看到https://regex101.com/r/fU0vY7/5,需要与$1+$2

:您可以使用替代替换相同的字符串。到目前为止,我测试过的所有东西都起作用,包括你的例子如果关闭了,请告诉。

它会更方便,避免捕获组,但缺乏回顾后的在javascript迫使我添加捕获组和$1+-$2 respectivelly

1

由于VKS指出,正则表达式不能严格地说,算。你可以抵消成对在Andris's answer,但正如你所看到的正则表达式有点长,当你覆盖所有的情况。另一种方法是正则表达式匹配具有正常功能的结合:

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

此拆分任务分为两个部分:

  1. 使用正则表达式匹配的+-
  2. 任何序列在更换函数,从匹配的字符串中删除+,并计算其余字符(其中,由于原始正则表达式,只能是- s)
  3. 返回eithe基于计数是否是偶数(即,,length % 2是零)或奇数
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) 
     ? '-' 
     : '+'; 
    }); 
}