4

问候亲爱的战友。

我无法弄清楚如何通过正则表达式完成以下操作。

我需要将此格式数字201101234转换为11-0123401,其中数字 3 和 4 成为破折号左侧的数字,其余五位数字插入破折号的右侧,然后是硬编码的 01。

我试过http://gskinner.com/RegExr,但语法让我失望。

这个答案,Equivalent of Substring as a RegularExpression,听起来很有希望,但我无法正确解析它。

我可以创建一个 SQL 函数来完成此操作,但我宁愿不锤击我的服务器以重新格式化某些字符串。

提前致谢。

4

4 回答 4

11

你可以试试这个:

var input = "201101234";
var output = Regex.Replace(input, @"^\d{2}(\d{2})(\d{5})$", "${1}-${2}01");

Console.WriteLine(output); // 11-0123401

这将匹配:

  • 两位数,后跟
  • 捕获为组 1 的两位数,然后是
  • 作为第 2 组捕获的五位数字

并返回一个字符串,将匹配的文本替换为

  • 第 1 组,其次是
  • 一个连字符,后跟
  • 第 2 组,其次是
  • 一个字面01

开始和结束锚点 ( ^/ $) 确保如果输入字符串与此模式不完全匹配,它将简单地返回原始字符串。

于 2013-07-31T20:44:26.573 回答
8

如果您可以使用自定义 C# 脚本,您可能希望使用 Substring 代替:

string newStr = string.Format("{0}-{1}01", old.Substring(2,2), old.Substring(4));
于 2013-07-31T20:45:15.060 回答
6

我不认为你真的需要一个正则表达式。子串会更好。但如果你只想要正则表达式,你可以使用这个:

string newString = Regex.Replace(input, @"^\d{2}(\d{2})(\d+)$", "$1-${2}01");

解释:

^\d{2}    // Match first 2 digits. Will be ignored
 (\d{2})  // Match next 2 digits. Capture it in group 1
 (\d+)$   // Match rest of the digits. Capture it in group 2

现在,所需的数字位于第 1 组和第 2 组中,您可以在替换字符串中使用它们。

于 2013-07-31T20:43:44.603 回答
0

你甚至 SQL 吗?拉一些杠杆和东西。

于 2014-11-13T15:45:50.600 回答