具有不同符号和可变数字格式的日期的正则表达式模式

时间:2016-11-26 19:28:19

标签: c# regex parsing

我正在尝试解析文本字段中的某些日期,这些日期可能采用以下格式(请注意文本字段周围有一堆其他垃圾):

//with dashes
10-10-16
1-5-16
10-1-16
1-10-16

//with periods
10.10.16
1.5.16
10.1.16
1.10.16

//with forward slashes
10/10/16
1/5/16
10/1/16
1/10/16

我需要的是所有数字格式场景的一种模式。这是我试过的:

//x.xx.xx
Regex reg1 = new Regex (@"\(?\d{1}\)?[-/.]? *\d{2}[-/.]? *[-/.]?\d{2}")

//xx.xx.xx
Regex reg2 = new Regex (@"\(?\d{2}\)?[-/.]? *\d{2}[-/.]? *[-/.]?\d{2}")

//x.x.xx
Regex reg3 = new Regex (@"\(?\d{1}\)?[-/.]? *\d{1}[-/.]? *[-/.]?\d{2}")

//xx.x.xx
Regex reg4 = new Regex (@"\(?\d{2}\)?[-/.]? *\d{1}[-/.]? *[-/.]?\d{2}")

我是正则表达式的新手,所以我正在寻找能够处理所有这些场景的单个表达式(即,数字格式,单个数字和双位数字 - /。之间)。

是否有一个表达式可以解决这个问题?

谢谢,

3 个答案:

答案 0 :(得分:2)

我可以建议

Regex rx = new Regex(@"\(?(?<!\d)\d{1,2}\)?[-/.]?\d{1,2}[-/.]?\d{2}(?!\d)");

如果一致地使用日期分隔符,请将反向引用与捕获组一起使用:

Regex rx = new Regex(@"\(?(?<!\d)\d{1,2}\)?([-/.])\d{1,2}\1\d{2}(?!\d)");

请参阅regex demo 1demo 2

<强>详情:

  • \(? - 可选的(
  • (?<!\d) - 当前位置之前必须没有数字
  • \d{1,2} - 1或2位数字
  • \)? - 可选的)
  • [-/.]? - 可选的-/.
  • \d{1,2}[-/.]? - 同上。
  • \d{2} - 2位数
  • (?!\d) - 当前位置后必须没有数字。

具有捕获组/反向引用的版本包含([-/.]) - ID = 1的捕获组与第一个分隔符匹配,而\1是与捕获到组1中的相同文本匹配的反向引用(使第二个分隔符与第一个分隔符相同。)

答案 1 :(得分:0)

您也可以尝试:\d{1,2}([-./])\d{1,2}\1\d{2}

Regex regex = new Regex(@"\d{1,2}([-./])\d{1,2}\1\d{2}");

  • \d{1,2}介于一位和两位数之间
  • ([-./])任意.-/
  • \1再次重复此字符(阻止匹配1.1/011-1.01
  • \d{2}匹配两位数字

答案 2 :(得分:0)

试试这个

\d{1,2}(-|\.|\/)\d{1,2}(-|\.|\/)\d{1,2}