正则表达式可选替代搜索

Regex optional alternative search

我正在尝试使用正则表达式从一些文本中获取一些信息作为组。 想要的结果超出了文本:Please check the Health of the JVM=acq855SW1-srv1 Please check the acq855SW1-srv2 profile.It seems like down 得到

到目前为止,我的正则表达式是 (?<Description>.*?the (?:JVM=|)(?<JvmName>[^\s]+)(?: profile.*+|)),我试图避免它也将 "Please check the Health" 作为匹配项这一事实。

我怎样才能使它不会在 "the Health" 处停止?

一个简单的解决方法是将 Health 与其他值区分开来,添加该值必须包含 -.

的约束

这可以通过将 [^\s]+ 更改为 [^\s]+-[^\s]+ 来完成。

所以结果正则表达式是:

(?<Description>.*?the (?:JVM=)?(?<JvmName>[^\s]+-[^\s]+)(?: profile.*+|))

如果 - 是无法完成的假设,您可以对数字进行同样的假设。

[^\s]+\d[^\s]+

我会使用:

(?<Description>(?:(?!JVM=).)*the (?:JVM=)?(?<JvmName>\S+)(?: profile.*+)?)

Demo & explanation

使用 PCRE 和其他一些引擎,如 Ruby、.NET、PyPi regex,您可以使用多个同名组并使用类似

的模式
(?<Description>.*?the\s+(?:JVM=(?<JvmName>\S+)|(?<JvmName>\S+)\s+profile.*))

要使其在 PCRE 中工作,请在模式开始处添加 (?J) 以启用该功能。

参见regex demo

详情

  • (?<Description> - Description 组开始:
    • .*? - 除换行字符外的任何 0+ 个字符,尽可能少
    • the - the
    • \s+ - 1+ 个空格
    • (?:JVM=(?<JvmName>\S+)|(?<JvmName>\S+)\s+profile.*) - 非捕获组匹配:
      • JVM=(?<JvmName>\S+):
      • JVM= - JVM= 子串
      • (?<JvmName>\S+) - 组 JvmName:1+ 个非空白字符
      • | - 或
      • (?<JvmName>\S+) - 组 JvmName:1+ 个非空白字符
      • \s+ - 1+ 个空格
      • profile - 这个词 profile
      • .* - 除换行字符外的任何 0+ 个字符,尽可能多。
  • ) - Description 组结束。