Java 如何jojn两个正则表达式以获得实际表达式

Java 如何jojn两个正则表达式以获得实际表达式,java,regex,Java,Regex,我只想捕获以下字符串。这里的重点是,1。它应该具有如下字符串说明:vusb0/iDRAC网络/vmk1,并且应该具有IPv4地址:169.254.10.12。像vmk1、vmk2这样的字符串在整个字符串中是不相关的,所有vmk1、vmk2都可以重复。作为正则表达式的一部分,我这样写 (^Description\s*:\s*vusb0\/iDRAC\s*Network\/.*) (^IPv4 Address\s*:) 我必须捕获描述为“description:vusb0/iDRAC Networ

我只想捕获以下字符串。这里的重点是,1。它应该具有如下字符串
说明:vusb0/iDRAC网络/vmk1
,并且应该具有
IPv4地址:169.254.10.12
。像vmk1、vmk2这样的字符串在整个字符串中是不相关的,所有vmk1、vmk2都可以重复。作为正则表达式的一部分,我这样写

(^Description\s*:\s*vusb0\/iDRAC\s*Network\/.*)
(^IPv4 Address\s*:)
我必须捕获描述为“description:vusb0/iDRAC Network/”的IPv4地址详细信息

是否有任何方法可以合并/加入上述两个正则表达式以获得IPv4地址或该字符串的段落详细信息?我想先用正则表达式实现它,然后用Java编写代码

vmk1
Description              : vusb0/iDRAC Network/vmk1
Status                   : Up
Interface Type           : Ethernet
DHCP                     : Disabled
MAC Address              : 00-50-56-6E-6F-99
FQDD                     : Not Applicable
IPv4 Address             : 169.254.10.12
Subnet Mask              : 255.255.255.0
IPv6 Address             : fe80::250:56ff:fe6e:6f99
Prefix Length            : 64
IPv4 DNSServer Address  0: 10.7.7.7
IPv4 DNSServer Address  1: 10.8.8.8
我一次就得到了下面一组字符串细节

lo0
Description              : lo0
Status                   : Up
Interface Type           : Loopback
DHCP                     : Disabled
MAC Address              : 30-03-27-E3-3B-03
FQDD                     : Not Applicable
IPv4 Address             : 127.0.0.1
Subnet Mask              : 255.0.0.0



vmk0
Description              : vmnic0/Management Network/vmk0
Status                   : Up
Interface Type           : Ethernet
DHCP                     : Enabled
DHCPServerV4             : 100.98.65.10
MAC Address              : 50-9A-4C-9C-99-8D
FQDD                     : NIC.Embedded.1-1-1
IPv4 Address             : 100.98.68.239
Subnet Mask              : 255.255.252.0
IPv6 Address             : fe80::529a:4cff:fe9c:998d
Prefix Length            : 64
IPv4 Gateway Address     : 100.98.68.1
IPv4 DNSServer Address  0: 10.7.7.7
IPv4 DNSServer Address  1: 10.8.8.8



vmk1
Description              : vusb0/iDRAC Network/vmk1
Status                   : Up
Interface Type           : Ethernet
DHCP                     : Disabled
MAC Address              : 00-50-56-6E-6F-99
FQDD                     : Not Applicable
IPv4 Address             : 169.254.10.12
Subnet Mask              : 255.255.255.0
IPv6 Address             : fe80::250:56ff:fe6e:6f99
Prefix Length            : 64
IPv4 DNSServer Address  0: 10.7.7.7
IPv4 DNSServer Address  1: 10.8.8.8


vmk2
Description              : vmnic1/iDRAC Network/vmk2
Status                   : Up
Interface Type           : Ethernet
DHCP                     : Disabled
MAC Address              : 00-50-56-6E-6F-99
FQDD                     : Not Applicable
IPv4 Address             : 169.254.3.1
Subnet Mask              : 255.255.255.0
IPv6 Address             : fe80::250:56ff:fe6e:6f99
Prefix Length            : 64
IPv4 DNSServer Address  0: 10.7.8.9
IPv4 DNSServer Address  1: 10.3.2.1



racadm>>
我还浏览了以下SO链接


您可以匹配以Description开头的整行,并使用
\h
匹配水平空格字符,而不是
\s
白色也可以匹配换行符

然后,您可以匹配以下所有不以空行(因为所有块不包含空行)、说明或IPv4地址开头的行

^Description\h*:\h*vusb0/iDRAC\h*Network/.+(?:\R(?!Description|IPv4 Address).*)*\RIPv4 Address\h+:\h*(\d{1,3}(?:\.\d{1,3}){3})
那会匹配的

  • ^Description\h*:\h*vusb0/iDRAC\h*Network/*
    以Description开头的行
  • (?:
    非捕获组
    • \R(?!Description | IPv4 Address)
      如果换行符没有以任何替代项开头
    • +
      匹配任意字符的1+倍
  • )*
    关闭分组并重复0多次
  • \RIPv4 Address\h+:\h*
    匹配以IPv4开头的行,并在水平空格字符之间匹配
  • Capturegroup 1
    • \d{1,3}(?:\.\d{1,3}){3}
      匹配类似ip的格式(或使用
  • 关闭第1组
|

在带有双转义反斜杠的Java中:

String regex = "^Description\\h*:\\h*vusb0/iDRAC\\h*Network/.+(?:\\R(?!Description|IPv4 Address).*)*\\RIPv4 Address\\h+:\\h*(\\d{1,3}(?:\\.\\d{1,3}){3})";

如果所有的零件都在那里,你可以把它缩短为

^Description\h*:\h*vusb0/iDRAC\h*Network/.*(?:.*\R)+?IPv4 Address\h+:\h*(\d{1,3}(?:\.\d{1,3}){3})

添加java代码我在那里添加了正则表达式
(^Description\s*:\s*vusb0\/iDRAC\s*Network\/.*)
(^IPv4地址*:)
如果您只在尚未发布的Java代码中执行两个匹配操作,而不是尝试创建一个模式,那么您的生活将更加轻松。事实上,当逐行处理输出时,在行字符串上加上一个简单的
startsWith
,会更简单、更有效。@Holger先生,我想用正则表达式的方式来处理,否则我的团队领导会拒绝我的PR,这就是我发布这个问题的原因。先生,回答太棒了,向你致敬。你能解释一下
\h*
\s*
之间的区别吗
\h*
\s*
之间的区别在于
\s*
也匹配换行符。我将对答案加上解释。