Как соединить два регулярных выражения, чтобы получить фактическое выражение - PullRequest
1 голос
/ 01 апреля 2020

Я хочу захватить только следующие строки. Вот ключевые моменты: 1. У него должна быть строка типа Description : vusb0/iDRAC Network/vmk1 и IPv4 Address : 169.254.10.12. Строки типа vmk1, vmk2 не имеют отношения ко всем строкам, и все vmk1, vmk2 могут повторяться. Как часть регулярного выражения, я написал так:

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

Я должен захватить детали адреса IPv4, где описание `Description: vusb0 / iDRA C Network / '.

Можно ли каким-либо образом объединить / объединить два вышеупомянутых регулярных выражения, чтобы получить адрес 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

, я получу следующую строковую информацию в одном 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>>

Я также прошел следующие ссылки SO.

Как я могу объединить эти два выражения регулярных выражений в одно?

Как объединить два регулярных выражения

1 Ответ

2 голосов
/ 01 апреля 2020

Вы можете сопоставить всю строку, начинающуюся с Description, и использовать \h для сопоставления горизонтальных пробельных символов вместо \s, белый также может совпадать с новой строкой.

Тогда вы можете сопоставить все следующие строки, которые не t начать с пустой строки (так как все блоки не содержат пустых строк), Description или 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/.* строка, начинающаяся с описания
  • (?: группа без захвата
    • \R(?!Description|IPv4 Address) Если символ новой строки не начинается с какой-либо альтернативы
    • .+ Соответствие 1+ раз любому char
  • )* Закрыть группу и повторить 0+ раз
  • \RIPv4 Address\h+:\h* Сопоставить строку, начинающуюся с IPv4, и сопоставить : между горизонтальными пробелами
  • ( Захват группа 1
  • ) Закрыть группу 1

Regex demo | Java демо

В 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})

Regex demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...