Как разобрать эти поля с одним регулярным выражением? - PullRequest
2 голосов
/ 26 сентября 2019

Мне нужно получить поля полужирный с одним регулярным выражением

<103> CP-MGMT xpand [2859]: конфигурация изменена с localhost пользователем adminслужбой dbset

<31> перенаправлено [4006]: rt_instance_monitor_job: запланированный монитор следующего экземпляра через 5 секунд

<134> CP_FireWall :2 июля 2016 г. 18:52:23 принять сообщение с IP-адресом

Я пытался использовать следующие шаблоны

(?:<\d{1,3}>)\s*(\S+?)(?:\[\d*\])?:(.*) - failed for 1st log

(?:<\d{1,3}>)(?:\S*\s)?([^\[\]]+?)(?:\[\d*\])?:\s(.*) - failed for 2nd and 3rd logs

Прошу прощения за любые ошибки с моей стороны.Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 26 сентября 2019

Вы можете использовать следующее выражение регулярного выражения:

(?:(?<=\s)\w+(?=\[))|(?:(?<=>)\w+(?=\[|:))

Regex Demo

По существу объединение двух ситуаций:

  1. Когда словонаходится между пробелом и [
  2. Когда слово находится между > и [ or :
4 голосов
/ 26 сентября 2019

Это регулярное выражение будет работать для предоставленных вами образцов данных:

(?:<\d{1,3}>).*?([^[]+?(?=:)|\w+(?=\[\d{4}\]:))

Он ищет

  • 1-3 цифры, заключенные в <>
  • минимальное количество символов;за которыми следуют либо
  • набор не [ символов, за которыми следуют символы : или
  • , за которыми следуют некоторые цифры, заключенные в [] и :

Требуемое значение находится в группе 1.

Демонстрация по regex101

2 голосов
/ 26 сентября 2019

Это выражение,

<\d{1,3}>\s*.*?(\S+?)(?:\[\d*\])?\s*:\s*(.*)

может просто работать нормально.

Тест

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class re{

    public static void main(String[] args){

        final String regex = "<\\d{1,3}>\\s*.*?(\\S+?)(?:\\[\\d*\\])?\\s*:\\s*(.*)";
        final String string = "<103>CP-MGMT xpand[2859]: Configuration changed from localhost by user admin by the service dbset\n\n"
             + "<31>routed[4006]: rt_instance_monitor_job: scheduled next instance monitor in 5 seconds\n\n"
             + "<134>CP_FireWall: 2Jul2017 18:52:23 accept ip address message";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }

    }
}

Вывод

Full match: <103>CP-MGMT xpand[2859]: Configuration changed from localhost by user admin by the service dbset
Group 1: xpand
Group 2: Configuration changed from localhost by user admin by the service dbset
Full match: <31>routed[4006]: rt_instance_monitor_job: scheduled next instance monitor in 5 seconds
Group 1: routed
Group 2: rt_instance_monitor_job: scheduled next instance monitor in 5 seconds
Full match: <134>CP_FireWall: 2Jul2017 18:52:23 accept ip address message
Group 1: CP_FireWall
Group 2: 2Jul2017 18:52:23 accept ip address message

Если вы хотите упростить / изменить / изучить выражение, это объяснено в верхней правой панели regex101.com .Если хотите, вы также можете посмотреть в эту ссылку , как она будет сопоставляться с некоторыми примерами входных данных.


RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

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