我有一个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();
感谢。
答案 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})