我正在尝试在C#中使用正则表达式来编辑字符串格式。
以前的格式是2015年8月9日或2015年8月9日,我试过的模式是"([0-9]{1,}|[0-9]{2,})/[0-9]{2,}/[0-9]{4,}"
新格式应为2015 08 09
我正在尝试使用匹配中的变量,但它只显示$ 1而不是$ 2或$ 3
string pattern = "([0-9]{1,}|[0-9]{2,})/[0-9]{2,}/[0-9]{3,}";
string replacement = "$3 $2 $1";
Regex rgx = new Regex(pattern);
string result = rgx.Replace(text, replacement);
richTextBox1.Text = result;
请帮我编辑正确的图案格式。
修改
我忘了写,起初我正在从.txt文件加载数据,在该数据中我将日期格式31/03/2015
或1/03/02
替换为2015 03 31
。
答案 0 :(得分:4)
如何将它们解析为DateTime
并获取具有特定格式的字符串表示,而不是正则表达式? (我认为你的09是天数)
string s = "9/08/2015";
DateTime dt;
if(DateTime.TryParseExact(s, "d/MM/yyyy", CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
dt.ToString("yyyy MM dd").Dump(); // 2015 08 09
}
或
string s = "09/08/2015";
DateTime dt;
if(DateTime.TryParseExact(s, "dd/MM/yyyy", CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
dt.ToString("yyyy MM dd").Dump(); // 2015 08 09
}
或DateTime.TryParseExact
has an overload将格式部分作为字符串数组,您可以提供多种格式。
var formats = new[] {"d/MM/yyyy", "d/MM/yyyy"};
if(DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out dt))
{
dt.ToString("yyyy MM dd").Dump(); // 2015 08 09
}
答案 1 :(得分:1)
因为你的正则表达式只有一个匹配的组。一个正确的是([0-9]{1,2})/([0-9]{2})/([0-9]{4})
。
括号用于标记组,您只用它们标记第一个。你的正则表达式有点不正确,因为它也匹配832947928/8237549875923/9999,这可能不是你需要的。
在这种形式中,它需要一个或两个数字,斜线,两个数字,斜线和四个数字并进行转换。
请注意,使用[0-9]{1,2}
也会允许无效日期,因此不适合验证。仅适用于此次转化。
答案 2 :(得分:1)
更简单的方法是使用.NET的内置解析器来表示日期。这也将确保无效输入,如" 99/99/0001"会失败。
DateTime res;
if (DateTime.TryParseExact(input, new [] {"dd/MM/yyyy", "MM/dd/yyyy"}, applicableCultureInfo, DateTimeStyles.None, out res)) {
return res.ToString("yyyy MM dd");
} else {
throw InvalidArgumentException("Unsupported date format");
}