C#正则表达式可选组不起作用

时间:2012-07-06 18:56:14

标签: c# regex

我正在尝试从这些字符串中获取部分: 第一:
2F4449534301224E4F204445534352495054494F4E20415641494C41424C45011F30303034342D30313230382D
第二:
2F4449534301224E4F204445534352495054494F4E20415641494C41424C45011F30303130312D3032323534012630303130312D31303932342D

基本上我想为两个字符串返回: 第一:
2F(+)011F(+)2D
第二:
2F(+)011F(+)0126(+)2D

我正在尝试使用这种模式:

Match m = Regex.Match(this.__line, 
                      @"^2F.*22(.*)011F(.*)(0126.*)?.{2}$", 
                      RegexOptions.IgnoreCase);

然而,当我尝试:

if (m.Success)
{
    if (m.Groups[3].Value != "")
    {
        Console.WriteLine("good");
    }
}
else
{
    Console.WriteLine("bad");
}

我从第二个字符串中得到“坏”,因为它与模式不匹配。我没有使用正确的模式吗?

3 个答案:

答案 0 :(得分:1)

问题在于你的模式是贪婪的。你应该使用这个模式:

^2F.*22(.*?)011F(.*?)(0126.*?)?.{2}$

你的正则表达式中的第二组匹配所有内容,直到最后的两个charcaters,因为它是贪婪的,最后一组是可选的。

要使你的比赛不合理使用吗?在量词之后。

Here是关于贪婪和不同意的更多信息。

希望这有帮助。

答案 1 :(得分:0)

拿出“^”。

2F 22(。)011F()(0126。?)。{2} $

http://regexpal.com/是我最喜欢的正则表达式工具。

答案 2 :(得分:0)

我想给你一些建议。 这些不是您问题的答案,只是一些好的做法提示

  • 除了新行)符号外,其他任何符号的性能都很差,您应该尽可能避免使用它。我可以看到,您可以用 \ S
  • 替换它
  • 对于不区分大小写的匹配,请使用语法(?i:pattern)。这使您可以选择 RegexOptions.Compiled ,这将为您提供更好的性能
  • 对于检索文本,建议使用命名捕获组。使用语法(?<name>pattern)。这样您就可以通过regexMatch.Groups["name"].Captures[0].Value
  • 检索它
  • 每当您有一个不想要回溯的组(仅用于匹配目的)时,使用语法(?:pattern)
  • 将其标记为非捕获组
  • 最后,RegexBuddy是一个很棒的(但付费的)工具。强烈推荐。

问候。