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

C#正则表达式替换-无法使用匹配的变量,c#,regex,C#,Regex,我正在尝试使用C#中的正则表达式来编辑字符串格式 以前的格式是2015年8月9日或2015年8月9日,我尝试的模式是“([0-9]{1,}|[0-9]{2,})/[0-9]{2,}/[0-9]{4,}” 新格式应为2015 08 09 我试图使用match中的变量,但它只显示$1,而不是$2或$3 string pattern = "([0-9]{1,}|[0-9]{2,})/[0-9]{2,}/[0-9]{3,}"; string replacement = "$3 $2 $1"; Regex

我正在尝试使用C#中的正则表达式来编辑字符串格式

以前的格式是2015年8月9日或2015年8月9日,我尝试的模式是
“([0-9]{1,}|[0-9]{2,})/[0-9]{2,}/[0-9]{4,}”
新格式应为2015 08 09

我试图使用match中的变量,但它只显示$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

代替正则表达式,将它们解析为
DateTime
并以特定格式获取它们的字符串表示形式如何?(我假设你的09是第二天)

或者将格式部分作为字符串数组,您可以提供多种格式

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
}

与其使用正则表达式,不如将它们解析为
DateTime
,并以特定格式获取它们的字符串表示形式?(我假设你的09是第二天)

或者将格式部分作为字符串数组,您可以提供多种格式

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
}

因为您的正则表达式只有一个匹配组。正确的是
([0-9]{1,2})/([0-9]{2})/([0-9]{4})

括号用于标记组,您仅使用括号标记第一个组。另外,您的regexp有点不正确,因为它还将匹配832947928/8237549875923/9999,这可能不是您所需要的

在这种形式下,它需要一个或两个数字,斜杠,两个数字,斜杠和四个数字,并进行转换


请注意,使用
[0-9]{1,2}
也将允许无效日期,因此不适合进行验证。仅用于此转换。

因为您的正则表达式只有一个匹配组。正确的是
([0-9]{1,2})/([0-9]{2})/([0-9]{4})

括号用于标记组,您仅使用括号标记第一个组。另外,您的regexp有点不正确,因为它还将匹配832947928/8237549875923/9999,这可能不是您所需要的

在这种形式下,它需要一个或两个数字,斜杠,两个数字,斜杠和四个数字,并进行转换


请注意,使用
[0-9]{1,2}
也将允许无效日期,因此不适合进行验证。仅用于此转换。

更简单的方法是使用.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");
}

更简单的方法是使用.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");
}

不要使用正则表达式来操作日期(太难了),这样更容易解析和格式化。“以前的格式是2015年8月9日或2015年8月9日”:您的意思是希望同时支持“dd/MM/yyyy”和“MM/dd/yyyy”?如果最好使用不含糊的示例。@juharr如果您只是将字符串转换为另一种格式,为什么要将其转换为另一种表示形式,只是将其作为字符串输出?如果它从未用作日期时间,或者不需要验证,那么来回转换就没有意义了。不要使用正则表达式来操作日期(太难),这样更容易解析和格式化。“以前的格式是2015年8月9日或2015年8月9日”:您的意思是希望同时支持“dd/MM/yyyy”和“MM/dd/yyyy”?如果最好使用不含糊的示例。@juharr如果您只是将字符串转换为另一种格式,为什么要将其转换为另一种表示形式,只是将其作为字符串输出?如果它从未用作日期时间,或者不需要验证,那么来回转换就没有意义。