2017-02-10 68 views
9

Her şeyden önce, düzenli ifadeler (henüz) hakkında çok fazla bilgi sahibi olmadığım için özür dilemem gerektiğini düşünüyorum. Aradığım ve arandığım, ancak buradaki özel sorunumla eşleşen bir çözüm bulamadım.Regex challenge: negatif sayıların formatlarını değiştirme

Şimdi burada soru gelir:

Şu anda bir ayrıştırıcı gelişmesi ile deney yaşıyorum (kendim yazmak için anlamı). Düzenli ifadeler dikkate alırken bunu yapmak isterim. Şimdiye kadar, oldukça fazla yapmayı başardım, ancak küçük bir problemle karşılaşıyorum. Tekli eksi işareti ve ikili eksi işareti.

On yıl önce üniversitede öğrendiklerim, bunun içeriğe dayalı olması gerektiğidir. Ancak, orada elle yaparken kullandığım basit bir hile de olduğunu ve farklı bir biçime her birli eksi yazıyor:

-3 = (0 - 3) 

veya

5 * -3 = 5 * (0 - 3) 

Biraz daha zor:

Şimdi
(5--5)-3 = (5 - (0 - 5)) - 3 

, benim sorum birbir tekli eksi ifadesini çevirir normal bir ifade yazmak için bir olasılık var, nedirbinary eksi parantezi ve 0 eklenmesiyle, yukarıdaki örneklerde olduğu gibi?

Belki ... orada da başka bir yol olabilir, ama ben biraz burada önyargılı alıyorum

Yorum: Önce kelime ile bütün eksi işaretlerini değiştirme çıkıyor EKSİ gibi:

expressionBuffer = "-(1-2)-3"; 
expressionBuffer = Regex.Replace(expressionBuffer, "-", "MINUS"); 
benzeyen yeni bir expressionBuffer için

Bu verimleri:

MINUS (1 MINUS 2) MINUS 3 

Şimdi, ikili yakalamaya çalışın '-' aşağıdaki uygulamada yaşadığı operatörler regex:

expressionBuffer = Regex.Replace(
        expressionBuffer, 
        @"(?<number>((\d+(\.\d+)?)))\s+MINUS", 
        "${number} -" 
        ); 

Ve bu verimleri:

MINUS (1 - 2) MINUS 3 

ilk EKSİ açıkça tekli bir operatördür (ama ikinci açıkça değil!) bu yüzden şimdi bir o yeniden yazmak için bir yol üzerinde arıyorum aşağıdaki (ilk) biçimi:

(0 - (1 - 2)) MINUS 3 

Ama burada böylece bir ikili eksi ilk tekli eksi tedavi etmek şaşırıp:

(0 - (1 - 2)) - 3 

Bunun için bir düzenli ifadeyi nasıl kullanacağınıza dair herhangi bir fikir var mı?

+0

o eksi tekli bir görünüyor ve sadece ilk '(', '-', '+', * ','/'sonra 2. 1. ise eğer, bir başka güçlük bu tekli eksi olabilir * yuva ed *: '---- 1 ' –

+0

Merhaba @DmitryBychenko, eğer doğru bir şekilde yorumunuzu anladım, evet, operatör önceliği dikkate alındığında, kesinlikle doğru. Yoksa başka bir şey mi demek istediniz? – RvdV79

+1

[Bu] gibi bir şey (https://regex101.com/r/2QSKDL/2)? –

cevap

3

Evet bunu yapabilir ancak aşağıdaki regex yalnızca tek tek işlem işleci yerini alacak çünkü sürece değişiklikler olduğu gibi yedek operasyonu çağırmak ettik:

private static Regex _regex = new Regex(@"(?<=^|[-(+*/])-(?<value>\d+|\((?:[^\(\)]|(?<open>\()|(?<-open>\)))+?(?(open)(?!))\))", RegexOptions.Compiled); 

private static string RemoveUnaryOperators(string input) 
{ 
    var result = Regex.Replace(input ?? string.Empty, @"\s+", string.Empty); 
    string tmp; 
    do 
    { 
     tmp = result; 
     result = _regex.Replace(result, @"(0-${value})"); 
    } 
    while (result != tmp); 

    return result; 
} 

DEMO

Çıktı:

5*-3 -> 5*(0-3) 
(5--5)-3 -> (5-(0-5))-3 
(5-------5)-3 -> (5-(0-(0-(0-(0-(0-(0-5)))))))-3 
-(1-2)-3 -> (0-(1-2))-3 
+0

Bir çekicilik gibi çalışır! Bunun için çok teşekkürler! – RvdV79

İlgili konular