【问题标题】:Regex with NOT option match c#带有 NOT 选项的正则表达式匹配 c#
【发布时间】:2018-09-22 05:55:44
【问题描述】:

我有以下文字输入-

Host             Expiration  Features            
**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 

(some other text..)

LICENSE **10.10.5.17 10May2018** 
LICENSE **172.17.64.120 never** 
LICENSE **172.17.64.120 never** 

我想获得所有 3 个许可证而不重复 - 以下正则表达式模式 - \d+\.\d+\.\d+\.\d+\s*(\d{1,2}[a-zA-Z]{3}\d{4}|从不) 匹配这些结果:

172.17.64.120    never
172.17.64.120    never
10.10.5.17       10May2018
10.10.5.17 10May2018
172.17.64.120 never
172.17.64.120 never

问题是,我想得到没有重复的结果。 是否有向正则表达式插入与最后 3 个结果不匹配的附加 not 选项(以 LICENSE+空格开头的那些)

10.10.5.17 10May2018
172.17.64.120 never
172.17.64.120 never

谢谢:)

【问题讨论】:

  • 为什么不稍后过滤返回的匹配数组?
  • 您是否只想在您的正则表达式前面添加 [^LICENSE **]

标签: c# regex


【解决方案1】:

如果我明白你在说什么......如果你的正则表达式有效,那么不要复杂,只需在结果上使用Distinct

List<string> results = <put your matches in here>;

results = results.Distinct();

Enumerable.Distinct Method (IEnumerable)

使用默认值从序列中返回不同的元素 相等比较器来比较值。

【讨论】:

    【解决方案2】:

    你可以在你的模式前面加上一个单词边界和一个否定的lookbehind,这将使LICENSE+一个或多个空格之后的匹配失败:

    \b(?<!\bLICENSE\s+)(\d{1,3}(?:\.\d{1,3}){3})\s*(\d{1,2}[a-zA-Z]{3}\d{4}|never)\b
    

    请参阅regex demo

    详情

    • \b - 单词边界
    • (?&lt;!\bLICENSE\s+) - 紧靠当前位置的左侧,不能有 LICENSE 后跟 1+ 个空格字符
    • (\d{1,3}(?:\.\d{1,3}){3}) - 第 1 组:一位、两位或三位数字,然后出现 3 次点,后跟 1 到 3 位数字
    • \s* - 0+ 个空格
    • (\d{1,2}[a-zA-Z]{3}\d{4}|never) - 1 位或 2 位数字,3 位 ASCII 字母和 4 位数字,或整个单词 never
    • \b - 字边界。

    【讨论】:

      猜你喜欢
      • 2016-06-06
      • 2022-01-12
      • 1970-01-01
      • 2016-01-10
      • 2016-06-13
      • 2016-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多