2013-12-16 85 views
1

我有在.NET 4.5中運行,看起來大致是這樣的代碼片段:C#Regex.replace(正則表達式,替換)的古怪行爲

function string replace(string content, string newfilename) { 
    Regex r = new Regex(@".*(/media/\d+/)(\w+)(\.(?:png|gif|jp{0,1}g|pdf|bmp))""{0,1}"); 
    var str1 = string.Empty; 
    var str2 = string.Empty; 
    var m = r.Matches(content); 

    if (m.Count > 0) 
    { 
     str1 = r.Replace(content, "$1" + newfilename + "$3"); 
     str2 = m[0].Groups[1].Value + newfilename + m[0].Groups[3].Value; 
    } 

... 

而給出的輸入(每串一個電話,NEWNAME感相同的正則表達式匹配組2)

內容#1

/media/1048/300x300-tK3s__MG_4391.jpg 

STR1

/media/1048/300x300-tK3s__MG_4391.jpg 

STR2

/media/1048/300x300-tK3s__MG_4391.jpg 


內容#2

/media/1047/300X300tk3s_M1Y9216.jpg 

STR1

$1300X300tk3s_M1Y9216.jpg 

STR2

/media/1047/300x300tK3s__M1Y9216.jpg 

這是怎麼回事在r.Replace()語句的第二個字符串?爲什麼我得到$ 1 newfilename $ 3?在這個特定的例子中唯一的區別是字符串中的短劃線和沒有短劃線的短劃線。

(請注意,輸入字符串可能與HTML標記的前面,因此.*在正則表達式的開頭)

編輯 我試圖做到的是在重命名一組文件採用基本格式/media/(int)/(filename).extension的文本引用的集合,因此這些示例並非真正理想。假設第二個例子的新文件名參數值爲MynewImage,結果應該是$ 1MynewImage.jpg其中我預料它會是/media/1047/MynewImage.jpg

和\ w不匹配的短劃線看起來不正確,它與短劃線相匹配,當短劃線出現時,替換方法起作用,當它沒有短劃線時,返回分組參數,而不是第一個捕獲組的實際值。但不適用於所有帶破折號的文件名,只有這些。

+0

模式結尾處的「{」{0,1}「是什麼意思? –

+1

您的正則表達式與第一個字符串不匹配 - '\ w'不包含'-'字符。在第二個字符串上運行代碼會產生預期結果:'/ media/1048/NEWFILENAME.jpg' –

+0

「{0,1}」從我以爲我可能需要它解析href中的文件名時遺留下來,標籤。 – Johan

回答

2

不知道確切一些在你的表達對象應該什麼來完成,但假設你只是想單獨捕獲的路徑,文件名和擴展名,該清理的表達應爲你工作:

(\/media\/\d+\/)([\w-]+)(\.(?:png|gif|jpe?g|pdf|bmp)) 

它現在匹配-的文件名,jpgjpeg,並且我從最後刪除了""{0,1}

在您的兩個內容例子:

MATCH 1

  1. /媒體/ 1048/
  2. 300x300的-tK3s__MG_4391
  3. 的.jpg

MATCH 2

  1. /媒體/ 1047/
  2. 300X300tk3s_M1Y9216
  3. 的.jpg

工作例如:http://regex101.com/r/jR1cX1(注意逃脫斜線以及 - 他們不應該影響到C#,但以防萬一...)

+0

非常好,這解決了我的問題,謝謝! – Johan

+0

嗯,罷工,我仍然有同樣的問題,替換方法不會做與匹配相同的東西,所以使用組屬性的作品 - 總是這樣做 - 替換方法做不同的事情。 – Johan

+0

好的,你能詳細解答一下這個問題嗎?或者你已經?也看到這個 - 可能是原因:http://stackoverflow.com/questions/8432983/why-is-1-ending-up-in-my-regex-replace-result – brandonscript