2016-04-12 15 views
1

için daha fazla pazarda yerini alıyor IIS Rewrite kuralları için bazı test senaryoları yazıyorum, ancak testlerim IIS ile aynı şekilde eşleşmiyor, bazı yanlış negatiflere yol açıyor.Regex.Replace,

Aşağıdaki iki satırın neden aynı sonuca yol açtığını söyleyen var mı?

Regex.Replace("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", ".*v[1-9]/bids/.*", "http://localhost:9900/$0") 
Regex.Replace("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", "v[1-9]/bids/", "http://localhost:9900/$0") 

Hem dönüş:

http://localhost:9900/v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a 

Ama geçen regex dönmek için beklenir: GUID eşleşmeyen gibi

http://localhost:9900/v1/bids/ 

.

IIS'de desen denetleyicisi aşağıdaki sonucu verir. {R:0}$0'a eşdeğer değil mi?

Ne Soruyorum geçerli: Ben Regex yapmanın IIS' yolunu eşleşebilir nasıl v[1-9]/bids/ test girişi önüne alındığında

, ben IIS yeniden ne gibi görünen sonuç http://localhost:9900/v1/bids/, olsun o kadar değiştirir için. Burada

IIS Regex Matching

+0

Girişiniz dizeleri çıkış aynıdır yüzden 'v1/tekliflerle /' başlamak Bkz. –

cevap

2

nokta var desen başlangıcında deney dizeleri maçları olmasıdır.

ilk .*v[1-9]/bids/.* Normal ifade eşleşirse 0+ bir satır dışındaki karakterler 0+ sonra (0 hariç) ve /bids/ ile izlenen ve bir rakam ile takip edilen son v herhangi karakterlerin ancak (mümkün olduğunca çok gibi) bir satır yukarı

. Dize başlangıçta eşleştiğinden, tüm dize eşleştirilir ve Grup 0'a yerleştirilir. Değiştirme işleminde, http://localhost:9900/ değerini bu değere önceden göndermeniz yeterlidir.

ikinci regex yedek regex v1/bids/ eşleştiği için Grup 0 sisteminde depolar, onu aynı sonucu verir ve http://localhost:9900/ + v1/bids/ değiştirir. Ne kalır, eşleşmediği için yeni eklenen sonuca eklenir.

Silmek için "kuyruk" u eşleştirmeniz gerekir.

sadece http://localhost:9900/v1/bids/ olsun v[0-9]/bids/ etrafında bir yakalama grubunu kullanmak ve yedek parçası $1 geribaşvuru kullanmak için:

(v[1-9]/bids/).* 

http://localhost:9900/$1 ile değiştirin. Sonuç: http://localhost:9900/v1/bids/

IIS parçaları size regex ile maç temel URL tutar ve daha sonra ekler regex demo

Güncelle

bakınız. Yani, sizin durumunuzda, temel URL olarak http://localhost:9900/ var ve daha sonra regex ile v1/bids/ eşleştirin.Yani, bu davranışı taklit etmek, sadece Regex.Match kullanın:

var rx = Regex.Match("v1/bids/aedd3675-a0f2-4494-a2c0-32418cf2476a", "v[1-9]/bids/"); 
var res = rx.Success ? string.Format("http://localhost:9900/{0}", rx.Value) : string.Empty; 

IDEONE demo

+0

Soruma daha fazla bilgi ekledim. Sorun, düzenli ifadeyi nasıl yazacağımız değil, onu yazan herşeyi nasıl test edeceğidir. Böylece testlerim IIS'ninkiyle eşleşecek. –

+0

'{R: 0}', '$ &' (veya '$ &'). 'V [1-9]/bids /', giriş dizesini kısmen eşleştirir, bu nedenle bir eşleşme vardır. '$ 0', regex deseniyle eşleşen tüm metni tutacaktır. Beklenen nedir? –

+0

IIS yeniden yazma modülünün gerçekten yeniden yazacağı dizeyi almak istiyorum. Bu durumda, yanlış olan http: // localhost: 9900/v1/bids/'olacaktır. Birisi yeniden yazma kuralı için yanlış bir regex yazdığı anlamına gelir. Doğru ifade, v [1-9]/bids /.* 'olabilir. Giriş olarak v [1-9]/bids/'regex verildiğinde, IIS'nin Guid de dahil olmak üzere tam yola yeniden yazacağını doğrulamam gerekiyor. Hangi değil. –

İlgili konular