2016-04-12 5 views
1
の値段よりも多くを置き換えます。

IIS書き換えルールのテストケースをいくつか書いていますが、私のテストはIISと同じ方法ではありません。Regex.Replaceは、

誰でも次の2行が同じ結果につながる理由を教えていただけますか?

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") 

どちらのリターン:

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

しかし、私は最後の正規表現を返すことを期待する:

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

GUIDが一致していないので。

IISでは、パターンテスタによって以下の結果が得られます。 {R:0}$0と等価ではありませんか?私が求めています何

がある:

v[1-9]/bids/のテスト入力を考えると、どのように私はIISが書き換えなるかのように見えるれ、私は結果http://localhost:9900/v1/bids/を得るように、正規表現を行うためのIIS」の方法は、置き換え一致させることができますに。ここ

IIS Regex Matching

+0

あなたの入力文字列が出力が同じである理由です 'V1 /入札/'で始まるを参照してください。 –

答えて

2

ポイントは、あなたが持っているパターンは、開始時にテスト文字列と一致していることです。

最初.*v[1-9]/bids/.*正規表現は0+任意の文字にマッチするが、最後vまで(できるだけ多く)改行は改行以外の文字(0以外の)数字で続き、/bids/で続き、その後0+ 。文字列が最初に一致するので、文字列全体が一致してグループ0に配置されます。置き換えでは、http://localhost:9900/をその値にプリペンドするだけです。

第二の正規表現置換は、正規表現がv1/bids/と一致するため、同じ結果を返し、グループ0にそれを格納し、http://localhost:9900/ + v1/bids/に置き換え。残っているものは、一致しないので置換結果に追加されます。

削除するには、 "tail"に一致する必要があります。

は、http://localhost:9900/v1/bids/を得るv[0-9]/bids/周りのキャプチャグループを使用し、交換部品に$1後方参照を使用するには:

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

http://localhost:9900/$1と交換してください。結果:http://localhost:9900/v1/bids/

は、IISは、ベースURLを保持し、その後、あなたが正規表現と一致を部品を追加する

更新regex demo

を参照してください。したがって、あなたの場合は、http://localhost:9900/をベースURLとし、v1/bids/と正規表現をマッチさせます。だから、この動作をシミュレートするために、ちょうどRegex.Matchを使用します。

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

私は私の質問にいくつかの情報を追加しました。問題は、正規表現を正しく書く方法ではなく、誰かがそれを書いた人をテストする方法は、最後に*の部分を見逃さなかった。私のテストはIISのテストと一致します。 –

+0

'{R:0}'は '$&'(または '$&')です。 'v [1-9]/bids /'は入力文字列に部分的にマッチします。 '$ 0'は正規表現パターンにマッチしたテキスト全体を保持します。期待されるものは何ですか? –

+0

IIS書き換えモジュールが実際に書き換える文字列を取得します。この場合、 'http:// localhost:9900/v1/bids /'になりますが、これは間違っています。誰かが書き換えルールの不正な正規表現を書いたことを意味します。正しい正規表現は 'v [1-9]/bids /.*'です。正規表現v [1-9]/bids/'regexが入力されているので、IISが実際にGuidを含む完全なパスに書き換えることを確認する必要があります。それはありません。 –

関連する問題