2017-03-07 50 views
0

我有一个文本文件,其中包含不同的数据。现在我需要在文件正确使用之前替换文件中的多个东西。我用正则表达式替换了文本。但现在我需要更改日期。但我无法弄清楚如何做到这一点。在C中查找日期和格式更改#

的日期是这样的:"utc": "2017-10-02 19:55:00.205263000 Z" 我想这个结果对于此日期格式的所有OCCURENCES: "utc": "2017-10-02 19:55:00"

我试图用下面的代码:

string pattern = @"{0:yyyy-mm-dd hh:mm:ss.fff Z}"; 
string replacement = "{0:yyyy-mm-dd hh:mm:ss"; 
Regex rgx = new Regex(pattern); 
string result = rgx.Replace(theInputTextFile, replacement); 

是它无法在正则表达式中使用日期格式。或者我在代码中犯了错误?

I used the information from here, for the date formats

+0

如您怀疑RegEx引擎不知道d/m/y等是日期/时间指示符 - 它们仅用于格式化。天真'\ d {4} - \ d {2}'匹配'4digits-2digits' ...对于完全严格匹配,'TryParseExact()'然后重新格式化。 –

回答

3

其实你可以给Regex.Replace方法的委托,让你可以转换其格式。 检查该页面中的例子: https://msdn.microsoft.com/en-us/library/cft8645c(v=vs.110).aspx

的代码示例如下,它发现你在问题中写道,并使用新的格式替换格式化日期:

class Program 
{ 
    static void Main() 
    { 
     string text = " dasd arew 2017-03-11 12:25:56.345 Z 2017-03-11 12:25:56.345 Z das tfgwe 2017-03-11 12:25:56.345 Z"; 
     string pattern = @"\d{4}\-\d{2}\-\d{2}\s\d{2}\:\d{2}\:\d{2}\.\d{3}\sZ"; 
     Regex r = new Regex(pattern); 
     var res = r.Replace(text, new MatchEvaluator(ConvertDateFormat)); 
     Console.WriteLine(res); 
    } 

    static string ConvertDateFormat(Match m) 
    { 
     var mydate = DateTime.Parse(m.Value); 
     return mydate.ToString("yyyy-MM-dd hh:mm:ss"); 
    } 

} 
+0

这假设你已经匹配正确的开始。 –

+0

@MattJohnson你是对的。我是这么认为的。我现在在我的代码示例中添加了正确的正则表达式模式 –

+0

是的,这有效。非常感谢你。 –

0

是它无法使用带正则表达式的日期格式

正确。这不可能。正则表达式和日期格式/解析令牌是两个不相关的概念。你需要匹配特定的文本。日期解析器的内部可能使用正则表达式来实现这样一个目标,但不能简单地将yyyy传递给Regex类,并期望它找到2017。你将不得不使用类似\d{4}的东西,它会捕获任何四个连续的数字。

另外请注意,日期格式标记是大小写敏感的,和你混在一起分钟(mm)伴月(MM),并使用12小时小时(hh),而不是24小时小时(HH)没有上午/ pm指示符(tt) - 不管它传递到正则表达式中都无妨。