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

C#正则表达式可选组不工作,c#,regex,C#,Regex,我试图从这些字符串中获取部分: 第一: 2F4449534301224E4F2044455334352495054494F4E2041564194C41424C45011F30303034342D30313230382D 第二: 2F4449534301224E4F2044455334352495054494F4E2041564194C41424C45011F30303130312D303232323534012630303130312D3103932342D 基本上,我想返回两个字符串: 第一

我试图从这些字符串中获取部分: 第一:
2F4449534301224E4F2044455334352495054494F4E2041564194C41424C45011F30303034342D30313230382D
第二:
2F4449534301224E4F2044455334352495054494F4E2041564194C41424C45011F30303130312D303232323534012630303130312D3103932342D

基本上,我想返回两个字符串: 第一:
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");
}

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

问题是您的模式太贪婪了。您应该使用以下模式:

^2F.*22(.*?)011F(.*?)(0126.*?)?.{2}$
正则表达式中的第二个组匹配所有内容,直到最后2个字符结束,因为它是贪婪的,最后一个组是可选的

要使您的火柴不粘,请使用?在量词后面

更多关于贪婪和非贪婪的信息

希望这有帮助。

取出“^”

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


是我最喜欢的正则表达式工具。

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

  • 除新行以外的任何符号()的性能非常差,应尽可能避免使用它。如我所见,您可以将其替换为\S
  • 对于不区分大小写的匹配,请使用语法
    (?i:pattern)
    。这使您可以选择RegexOptions.Compiled,这将为您提供更好的性能
  • 对于检索文本,建议使用命名捕获组。使用语法
    (?模式)
    。这样,您可以通过
    regexMatch.Groups[“name”]检索它。捕获[0]。值
  • 当您有一个不想检索的组(仅用于匹配目的)时,使用语法
    (?:模式)
  • 最后,这是一个很好的(但付费的)工具。强烈推荐

问候。

您是否忘记在第二个模式中大写
f
,或者这只是一个打字错误?