2013-10-22 58 views
2

我有一個如下所示的字符串:myFile {ddmmyyyy} .csv和一個C#DateTime對象。我需要將DateTime中正確的日/月/年替換爲字符串。然而,問題在於這些參數可以按照不同的順序,而不是所有的參數都可能存在。RegEx for placeholder(mmddyyyy)沒有特定順序

例如所有這些都是有效的使用情況:

  • MYFILE {} DDMMYYYY的.csv
  • MYFILE {} MMDDYYYY的.csv
  • MYFILE {} mmyyyy的.csv
  • MYFILE {} YYYYMM的.csv

任何關於正則表達式的建議/想法,我可以用來找到/替代這些將不勝感激!

編輯:只是要清楚,我得到了「mmddyyyy」在那裏(字符,而不是相應的數字)的實際字符串,其中「mm」需要替換月份編號(例如10代表10月份,例如)爲收到的日期時間。

+1

你確定你需要一個正則表達式而不是''string.Format()''嗎? – acfrancis

+0

string.Format()是不夠的,因爲我收到一個文字字符串,如「myFile {ddmmyyyy} .csv」以及一個DateTime,並且需要結果看起來像「myFile22102013.csv」,但我事先不知道哪一個爲了mmddyyyy將會在或者即使它們中的任何一個將會在場。 – Qualia

回答

1
private static string FormatFilename(string pattern, DateTime dt) 
{ 
    return Regex.Replace(pattern, @"\{(.*)\}", match => 
    { 
     string format = match.Result("$1").Replace("m", "M"); 
     return dt.ToString(format, CultureInfo.InvariantCulture); 
    }); 
} 

然後,只需這樣稱呼它(例如):

string input = "myFile{ddmmyyyy}.csv"; 
DateTime dt = new DateTime(2013, 1, 4); 
string filename = FormatFilename(input, dt); 

更新

可以做到這一點沒有一個正則表達式:

private static string FormatFilename(string pattern, DateTime dt) 
{ 
    return string.Format(pattern.Replace("{", "{0:").Replace("mm", "MM"), dt); 
} 

但我覺得其他版本是更清潔和更彈性的輸入變化。

+0

謝謝 - 這正是我所需要的,完美的作品! – Qualia

0

will \ w + \ d + .csv適合你嗎?

+0

不,不幸的是 - 這對我所需要的有點過於寬泛。 – Qualia

0

僅有匹配

@"myFile\d{8}.csv" 

並使用DateTime.ParseExactDateTime.TryParseExact解析它(使用接受的格式的陣列的過載)

+0

我不確定上述方法是如何工作的,因爲我接收到像myFile {ddmmyyyy} .csv這樣的字符串以及一個DateTime,並且需要結果看起來像「myFile22102013.csv」,就像我上面的註釋一樣,但是{}內的實際參數順序/編號有所不同? – Qualia

+0

只需製作「myFile \\ d {8} \\。csv」'然後,請參閱編輯 – sehe