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
- 对于不区分大小写的匹配,请使用语法
。这使您可以选择RegexOptions.Compiled,这将为您提供更好的性能(?i:pattern)
- 对于检索文本,建议使用命名捕获组。使用语法
。这样,您可以通过(?模式)
regexMatch.Groups[“name”]检索它。捕获[0]。值
- 当您有一个不想检索的组(仅用于匹配目的)时,使用语法
(?:模式)
- 最后,这是一个很好的(但付费的)工具。强烈推荐
问候。您是否忘记在第二个模式中大写
f
,或者这只是一个打字错误?