正则表达式匹配日期

时间:2011-07-01 13:53:42

标签: c# .net regex

我有一个HTML输入,有三个这样的模式:

模式一

</div>

<div class="myclass">

模式二

</div>

    <p class="ProductMeta">29-06-2011</p>

<div class="myclass">

模式trhee

</div>

    <p class="ProductMeta">29/06/2011</p>

<div class="myclass">

我正在尝试创建一个可以捕获树日期的RegEx:空,带破折号和斜杠。我想我需要某种嵌套组,但不能使它工作。

这是我创建的RegEx:

Regex r = new Regex(
                @"src=""</div>\s+<p class=""ProductMeta"">([\d\/\-]+)"
                , RegexOptions.Compiled | RegexOptions.IgnoreCase);

并尝试以下方法使该组可选:

Regex r = new Regex(
                    @"src=""</div>[\s+<p class=""ProductMeta"">([\d\/\-]+)]?"
                    , RegexOptions.Compiled | RegexOptions.IgnoreCase);

任何人都可以帮助我吗?

控制台测试执行以下操作以在屏幕上打印:

foreach (Match m in mcl)
            {
                Console.WriteLine(m.Groups[1].Value.Replace("-","/") + " - " + m.Groups[5].Value);
            }

            Console.Read();

感谢。

4 个答案:

答案 0 :(得分:1)

您创建的正则表达式中只有1个组(第一个组),但您将获得第6个组。

  Regex r = new Regex(
            @"src=""</div>\s+<p class=""ProductMeta"">([\d\/\-]+)"
            , RegexOptions.Compiled | RegexOptions.IgnoreCase);
  foreach (Match m in mcl)
     Console.WriteLine(m.Groups[1].Value.Replace("-","/"));

第二个正则表达式是完全错误的,因为你把你想要匹配的东西放在一个字符类中(这意味着它会匹配你列表中的任何一个字符。)所以,[\s+p ]会匹配一个空格字符,空格或加号+p

答案 1 :(得分:1)

我将此分为两个正则表达式

首先匹配p类:

<p\s(?:[^\s>]*?\s)*?(class="ProductMeta")>.*

然后匹配日期(美国和英国):

/^((0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])|(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01]))[- /.](19|20)?\d\d$/gm

我不是说它完美,但它有效:)

答案 2 :(得分:1)

您无法将[]设为可选组。只有()可以是可选的。

var test1 = 
@"</div>
<div class=""myclass"">";

var test2 =
@"</div>
    <p class=""ProductMeta"">29-06-2011</p>
<div class=""myclass"">";

var test3 = 
@"</div>
    <p class=""ProductMeta"">29/06/2011</p>
<div class=""myclass"">";

string re = @"</div>\s+(<p class=""ProductMeta"">(\d\d([-/])\d\d\3\d\d\d\d))?";
Regex regExpr = new Regex(re, RegexOptions.Multiline);

Console.WriteLine(regExpr.Match(test1).Groups[2].Value); //== ""
Console.WriteLine(regExpr.Match(test2).Groups[2].Value); //== "29-06-2011" 
Console.WriteLine(regExpr.Match(test3).Groups[2].Value); //== "29/06/2011"

答案 3 :(得分:1)

您可以使用此正则表达式:</div>\s*<p class="ProductMeta">(\d{2}[-/]\d{2}[-/]\d{4})