1

I want to capture only the following strings. Here the key points are , 1. It should have the string like this Description : vusb0/iDRAC Network/vmk1 and it should have IPv4 Address : 169.254.10.12. The strings like vmk1, vmk2 are irrelevant in the entire strings and all vmk1, vmk2 can be repeated. As part of regular expression, I have written like this.

(^Description\s*:\s*vusb0\/iDRAC\s*Network\/.*)
(^IPv4 Address\s*:)

I have to capture the IPv4 address details where the description is `Description : vusb0/iDRAC Network/'.

Is there any way so that I can merge/join the above two regular expressions to achieve the IPv4 address or the paragraph of that string details ? I want to achieve it in a regex way first and after I that I will write code in 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

I get the below bunch of string details in one go.

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>>

I have also gone through the following SO links.

How can I combine these two regex expression to one?

How to combine two regex's

PythonLearner
  • 1,416
  • 7
  • 22
  • 2
    add your java code – GolamMazid Sajib Apr 01 '20 at 09:23
  • I have added the regex there. `(^Description\s*:\s*vusb0\/iDRAC\s*Network\/.*)` and `(^IPv4 Address\s*:)` – PythonLearner Apr 01 '20 at 09:25
  • 1
    Your life will be much easier if you just perform two match operations in the Java code you still didn’t post, instead of trying to make one pattern. In fact, when processing the output line by line, a plain `startsWith` on the line string will be even simpler and more efficient. – Holger Apr 01 '20 at 10:42
  • @Holger Sir, I wanted to do it in regex way otherwise my team leader will reject my PR, that is why I posted this question. – PythonLearner Apr 01 '20 at 13:59

1 Answers1

2

You could match the whole line starting with Description and use \h to match horizontal whitespace chars instead of \s white could also match a newline.

Then you could match all following lines that don't start with either an empty line (as all the blocks don't contain empty lines), Description or IPv4 Address.

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

That will match

  • ^Description\h*:\h*vusb0/iDRAC\h*Network/.* The line starting with Description
  • (?: Non capture group
    • \R(?!Description|IPv4 Address) If the newline does not start with any of the alternatives
    • .+ Match 1+ times any char
  • )* Close group and repeat 0+ times
  • \RIPv4 Address\h+:\h* Match the line that starts with IPv4 and match : between horizontal whitespace chars
  • ( Capture group 1
  • ) Close group 1

Regex demo | Java demo

In Java with double escaped backslashes:

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

If all the parts are always there, you might shorten it to

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

Regex demo

The fourth bird
  • 154,723
  • 16
  • 55
  • 70