Сложное (PHP) регулярное выражение с положительным взглядом - PullRequest
2 голосов
/ 05 февраля 2020

Я хочу сопоставить следующую тестовую строку ( строка 2 и строка 3 ), где строка 3 будет в случайном порядке, а строка 2 будет константой.

    X509v3 extensions:
        X509v3 Subject Alternative Name:
            IP Address:55.66.77.88, DNS:example.com, DNS:www.example.com, IP Address:44.33.22.11
Signature Algorithm: sha384WithRSAEncryption

Я могу получить совпадение в строке 3, используя следующее регулярное выражение:

\s+(?|(DNS):([\w\.\d]+),|(IP Address):([\d\.]+))

Но затем, когда я добавляю положительный взгляд за спиной, как показано ниже, я больше не получаю полный матч. Любая помощь будет оценена.

(?<=X509v3 Subject Alternative Name:\s)\s+(?|(DNS):([\w\.\d]+),|(IP Address):([\d\.]+))

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Поскольку вы извлекаете, вы можете значительно упростить ваш шаблон до (DNS|IP Address):([\w.]+), где IP-адрес совпадает с [\w.]+, как DNS, как \w также совпадает с цифрами. Затем, чтобы определить пользовательскую границу, вы можете использовать шаблон на основе \G, например

(?:\G(?!\A),\s*|X509v3 Subject Alternative Name:\s+)(DNS|IP Address):([\w.]+)

. См. Демонстрационную версию regex

Подробнее

  • (?:\G(?!\A),\s*|X509v3 Subject Alternative Name:\s+) - любой из двух вариантов:
    • \G(?!\A),\s* - конец предыдущего успешного совпадения (\G(?!\A)), затем запятая и 0+ пробелов
    • | - или
    • X509v3 Subject Alternative Name:\s+ - X509v3 Subject Alternative Name: подстрока и затем 1+ пробелы
  • (DNS|IP Address) - Группа 1: DNS или IP Address
  • : - двоеточие
  • ([\w.]+) - Группа 2: одно или несколько слов (букв, цифр или _) или точечных символов.
1 голос
/ 05 февраля 2020

Когда мы добавляем положительный взгляд, только первая запись в следующей строке будет совпадать, потому что для остальных IP-адресов или имен DNS, положительный взгляд на самом деле не перед ними. Текст X509v3 Subject Alternative Name: находится перед первым IP-адресом или DNS-именем.

Это шаблон просмотра за пределами списка (Шаблон 1) :

(?<=X509v3 Subject Alternative Name:)\s+(DNS:([\w\.\d]+),|IP Address:([\d\.]+))

И это шаблон IP-адреса или DNS-имени (шаблон 2) :

\s+(DNS:([\w\.\d]+),|IP Address:([\d\.]+))

Следовательно, вам придется сделать это, я думаю:

  1. Первая проверка если текст соответствует шаблону 1. Это гарантирует, что вы выбрали нужную вам строку или запись.
  2. Затем примените шаблон 2 и выберите значения.

I проверил его на Java и обнаружил, что он работает. Поскольку вы упомянули PHP в заголовке, я подумал, что код может быть вам не полезен. Следовательно, не публикуя.

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