0

我想从这些字符串得到部分:第一:
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");
}

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

4

3 回答 3

1

问题是你的模式是贪婪的。您应该改用此模式:

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

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

要使您的匹配不贪婪,请使用 ? 在量词之后。

是有关贪婪和非贪婪的更多信息。

希望这可以帮助。

于 2012-07-06T19:02:41.360 回答
0

取出“^”。

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

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

于 2012-07-06T19:02:45.957 回答
0

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

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

问候。

于 2012-07-06T19:15:25.900 回答