grok匹配模式的正则表达式

时间:2015-07-16 13:25:36

标签: regex

对于以下两行,我需要相同的正则表达式

  PieceID = NEW00000009

  piece_id="NEW00000009"

找到我的模式:

[pP]iece[_]*[iI][dD][" "]*=[" "]*["]*(?<PieceID>[A-Z0-9]["]*{11})"

2 个答案:

答案 0 :(得分:1)

你离好的模式不远,但你需要做几点澄清:

  • 要使某些内容可选,请使用?(表示{0,1})而不是*(这意味着{0,})。
  • 你不需要在空格周围加上引号,空格字符没有什么特别之处。即使是一个角色也很特别,你永远不需要用引号来保护它。

您的模式可以这样写:

[pP]iece_?[iI][dD] *= *"?(?<PieceID>[A-Z0-9]{11})"?

您可以更加严谨,避免匹配piece_id=NEW00000009"

之类的内容
[pP]iece_?[iI][dD] *= *("?)(?<PieceID>[A-Z0-9]{11})\\1

可选引用在第1组中捕获,\\1是第1组的反向引用

要完成,如果用\\s*替换空格(\\s是任何空格的字符类)或[^\\S\\r\\n]*只允许水平空格,则可以使其更灵活

答案 1 :(得分:0)

你需要担心这种情况下的区分大小写,但我认为它会做你想要做的事情。

var s1 = "PieceID = NEW00000009";
var s2 = @"piece_id=""NEW00000009""";

var re = new Regex(@"^(PieceID|piece_id)\s*=\s*\""?(?<PieceID>[A-Z0-9]{11})\""?$");

Console.WriteLine(re.IsMatch(s1));
Console.WriteLine(re.IsMatch(s2));

输出:

True
True