正则表达式可选替代搜索
Regex optional alternative search
我正在尝试使用正则表达式从一些文本中获取一些信息作为组。
想要的结果超出了文本:Please check the Health of the JVM=acq855SW1-srv1 Please check the acq855SW1-srv2 profile.It seems like down
得到
- 第一个匹配项:描述为'请检查
JVM=acq855SW1-srv1' 和 JVM'acq855SW1-srv1'
- 第二场比赛:描述为“请检查 acq855SW1-srv2 profile.It 似乎已关闭”和 JVM 'acq855SW1-srv2'
到目前为止,我的正则表达式是 (?<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.*+)?)
使用 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
组结束。
我正在尝试使用正则表达式从一些文本中获取一些信息作为组。
想要的结果超出了文本:Please check the Health of the JVM=acq855SW1-srv1 Please check the acq855SW1-srv2 profile.It seems like down
得到
- 第一个匹配项:描述为'请检查 JVM=acq855SW1-srv1' 和 JVM'acq855SW1-srv1'
- 第二场比赛:描述为“请检查 acq855SW1-srv2 profile.It 似乎已关闭”和 JVM 'acq855SW1-srv2'
到目前为止,我的正则表达式是 (?<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.*+)?)
使用 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
组结束。