C#正则表达式替换 - 无法使用匹配的变量

时间:2015-04-13 13:58:48

标签: c# regex

我正在尝试在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/20151/03/02替换为2015 03 31

3 个答案:

答案 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");
}