我有在.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,1}「是什麼意思? –
您的正則表達式與第一個字符串不匹配 - '\ w'不包含'-'字符。在第二個字符串上運行代碼會產生預期結果:'/ media/1048/NEWFILENAME.jpg' –
「{0,1}」從我以爲我可能需要它解析href中的文件名時遺留下來,標籤。 – Johan