【问题标题】:Match second instance匹配第二个实例
【发布时间】:2018-11-02 01:05:36
【问题描述】:

我有一个这样的字符串,我只想查找它是否包含'N2',而不是'EN2',所以应该忽略:

EN2T65G872N2ULKJJDLO05

如果有帮助的话,它总是以 EN2 开头,但 N 数字可能与 N3 不同。我只是不希望它错误地将一个单位识别为 N2,除非它实际上包含该单位

我该怎么做呢?

【问题讨论】:

  • (?<!E)N2 如果我明白你在问什么... 零宽度否定后向断言。仅当左侧子模式不匹配时才继续匹配
  • 这个问题可以使用更多的例子(匹配和不匹配)。正则表达式的标签 wiki 提供了更多有用的建议stackoverflow.com/tags/regex/info

标签: c# regex match


【解决方案1】:

类似这样的:

var rx = new Regex("(?:^EN[0-9].*?)(N[0-9])");

var match = rx.Match(str);

if (match.Success)
{
    var nx = match.Groups[1].Value;
}

^ 表示字符串的开头,(?: ) 是非捕获组,因为我们对它不感兴趣,.*? 是任意次数但非贪婪的任意字符。

【讨论】:

  • 你的正则表达式提供的字符串的统计数据中的 E 后面的 OP 不是。
  • @SimonPrice 请注意非捕获组的使用,以及提取第二个Nx 的值的事实,我使用的是Groups[1].Value。
  • 我认为这可能取决于问题的措辞,我认为它需要 N2,所以 EN2 确实包含 N2,所以是的,有两场比赛我会放弃 E 而取 N2索引 0。但我想这取决于 OP 的含义以及他们如何查看数据
  • 这很好用,但是如果前面的几个字母发生变化,我怎么能修改它来工作,例如 EI4 而不是 EN2?
  • @J.James 不清楚你在问什么。如果第一个实例是EI4,N2 不能是 第二个 实例
【解决方案2】:

使用分组匹配第二种情况:N2.*?(N2)

https://regex101.com/r/005u2q/1

N 号可能不同使用:N\d.*?(N\d)

【讨论】:

    【解决方案3】:

    看看这个,让我知道这是否是您想要用来获取值的正则表达式。您将在示例中看到,这将在字符串中获得 N2 和 N3 值,因此您需要将匹配的值放入列表或数组中,然后选择您要查找的第一个 N2、N3 Nx。

    https://regexr.com/3pso3

    这与这里的其他答案不同,只会得到 N 和下一个数字

    【讨论】:

      【解决方案4】:

      你可以在你的正则表达式中使用negative lookbehind:

      (?<!E)N[0-9]
      

      这个正则表达式将匹配任何包含“N”字符的序列:前面没有“E”字符;后跟任何数字。 这是一个示例:RegExr。

      【讨论】:

      • 您的示例获得了第二个 N2,但缺少第一个
      • 我相信这个问题明确说如果之前有一个“E”,它不应该匹配“N2”,不是这样吗?
      • 引用问题:“我只想查找它是否包含'N2',而不是'EN2',所以应该忽略它”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 2014-04-27
      • 2015-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多