2015-08-03 12 views
6

Desidero scrivere una funzione .replace in JavaScript che implementa la regola pari-dispari di segni negativi in ​​algebra. In una serie di segni negativi e positivi:Regex per implementare la regola pari-dispari di segni negativi

  • Caso 1: Se c'è un numero dispari di segni negativi, è equivalente ad un segno negativo
  • Caso 2: Se c'è un numero pari di negativo segni, è equivalente a un segno positivo.

Quindi vorrei quindi fare .replace(/regex for case1/, "-") e .replace(/regex for case2/, "+"). Qualche idea su come fare questo?

Qui ci sono esempi di stringhe:

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

regex e matematica sono ossimori :) – vks

+0

Ah ok. Bene, un'altra soluzione sarebbe la seguente – guillefix

+0

Inoltre, c'è qualcosa di simile alla regex ma per la matematica allora? – guillefix

risposta

1

Beh si potrebbe sostituire tutte + s con -- e poi sostituire di conseguenza:

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

Oppure si potrebbe utilizzare una funzione nel vostro .replace per contare il numero di - 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 '+' 

Questo è solo un algoritmo. Spero che tu possa ottenere la tua soluzione da qui.

1

([^-+]|^)(?:[+]*-[+]*-)*[+]*-[+]*([^+-]) per numero dispari di trattini, come si è visto https://regex101.com/r/fU0vY7/4, ha bisogno di essere sostituito con $1-$2

([^-+]|^)(?:[+]*-[+]*-[+]*)+([^+-]) anche per numero di trattini, come si è visto https://regex101.com/r/fU0vY7/5, deve essere sostituito con $1+$2

È possibile utilizzare sia sostituisce sulla stessa stringa. Finora tutto ciò che ho testato ha funzionato, inclusi i tuoi esempi. Se qualcosa è spento, dillo.

Sarebbe più conveniente per evitare i gruppi di cattura, ma la mancanza di lookbehind in javascript mi ​​ha costretto a aggiungere i gruppi di cattura e $1+-$2 respectivelly

1

Come VKS sottolinea, le espressioni regolari non possono, a rigor di termini, contano . È possibile annullare le coppie come in Andris's answer, ma come si può vedere le espressioni regolari diventano un po 'lunghe quando si coprono tutti i casi. Un'alternativa è quella di combinare corrispondenza regexp con una funzione normale:

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

Questo divide il compito in due parti:

  1. Utilizzare un regexp a una qualsiasi sequenza di + e -
  2. In sostituzione funzione, rimuovere i + dalla stringa corrispondente e contare i caratteri rimanenti (che, grazie alla regexp originale, possono essere solo - s)
  3. Return eithe r a + o -, in base al fatto che il conteggio sia pari (ad es., length % 2 è zero) o dispari
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) 
     ? '-' 
     : '+'; 
    }); 
}