如何在C#中使用带NOT选项的正则表达式匹配指定文本?
在C#中使用负向正则断言实现NOT匹配需求
从你提供的主机过期特性文本来看,我们可以通过正则的负向断言来实现类似"NOT"选项的匹配逻辑——毕竟正则本身没有直接的NOT运算符,但负向前瞻/后顾断言完全能满足排除特定模式的需求。下面结合你的文本场景给出具体解决方案:
常见场景与正则实现
场景1:提取带有具体过期日期的条目(排除never过期的主机)
如果只想匹配标注了明确过期日期(比如10May2018)的主机特性,排除never永久有效条目,可以用这个正则:
\*\*(?!.*never)\d+\.\d+\.\d+\.\d+ \w+\d+\*\*.*?(?=\*\*|LICENSE|$)
正则解释:
\*\*:匹配目标条目开头的加粗标记(?!.*never):负向前瞻断言,确保后续内容不包含never\d+\.\d+\.\d+\.\d+:匹配标准IP地址格式\w+\d+:匹配类似10May2018的日期格式.*?(?=\*\*|LICENSE|$):匹配后续的特性内容,直到遇到下一个加粗标记、LICENSE关键词或文本结尾
场景2:提取非LICENSE前缀的主机条目(排除LICENSE相关记录)
如果需要排除那些以LICENSE开头的条目,提取独立的主机特性内容,用这个正则:
(?!LICENSE\s)\*\*\d+\.\d+\.\d+\.\d+ (?:never|\w+\d+)\*\*.*?(?=\*\*|LICENSE|$)
正则解释:
(?!LICENSE\s):负向前瞻断言,确保当前位置前不是LICENSE(注意空格)(?:never|\w+\d+):匹配两种过期时间格式——never或具体日期- 其余部分和场景1一致,负责匹配IP、特性内容直到分隔符
C#代码示例
下面是场景1的完整实现代码,你可以根据需求替换正则表达式:
using System; using System.Text.RegularExpressions; class HostLicenseMatcher { static void Main() { string input = @"主机过期特性 **172.17.64.120 never** CPSM-C-BASE CPSB-NPM CPSB-EPM CPSB-LOGS CPSB-MNTR CPSB-MPTL CPSB-UDIR CPSB-PRVS CPSB-GBLP CK-77B458DF8D52 **172.17.64.120 never** CPSM-C-U CPSB-NPM CPSB-EPM CPSB-LOGS CPSB-MNTR CPSB-MPTL CPSB-UDIR CPSB-PRVS CPSB-GBLP CK-FF18475CE402 **10.10.5.17 10May2018** CPSM-C-U CPSB-NPM CPSB-EPM CPSB-LOGS CPSB-MNTR(其他文本...)LICENSE **10.10.5.17 10May2018** LICENSE **172.17.64.120 never** LICENSE **172.17.64.120 neve..."; // 替换成场景2的正则即可切换匹配逻辑 string pattern = @"\*\*(?!.*never)\d+\.\d+\.\d+\.\d+ \w+\d+\*\*.*?(?=\*\*|LICENSE|$)"; MatchCollection matches = Regex.Matches(input, pattern, RegexOptions.Singleline); Console.WriteLine("匹配到的有效条目:"); foreach (Match match in matches) { Console.WriteLine(match.Value.Trim()); } } }
代码说明:
RegexOptions.Singleline:让.可以匹配换行符,确保跨行的内容也能被正确匹配MatchCollection:存储所有符合条件的匹配结果- 若需要调整排除规则,只需修改正则中的负向断言部分即可(比如排除特定IP,改成
(?!172\.17\.64\.120))
内容的提问来源于stack exchange,提问作者Orel Hasis
相关产品推荐
相关产品推荐

