написание регулярного выражения в Java для строки, присутствующей между строкой

1

Моя строка ввода:

subtype=forward,level=notice,vd=root,srcip=10.100.1.121,srcport=55844,srcintf=port1,dstip=173.193.156.43,dstport=80,dstintf=port16,sessionid=1224203695,status=close
subtype=forward,level=notice,vd=root,srcip=10.100.1.121,srcport=55844,srcintf=port1,dstip=173.193.156.43,dstport=80,dstintf=port16,sessionid=1224203695,status=open 

Это код, который я пробовал:

Pattern patt = Pattern.compile("(srcip=(?:\\d+\\.)+\\d+)(?:.*)?(dstip=(?:\\d+\\.)+\\d+)(?:.*)?(status=(?=.*close.*)(?:.*)?(dstport=(\\d+))");

BufferedReader r = new BufferedReader(new FileReader("ttext.txt"));

// For each line of input, try matching in it.
String line;
while ((line = r.readLine()) != null) {
  // For each match in the line, extract and print it.
  Matcher m = patt.matcher(line);
  while (m.find()) {
    // Simplest method:

    System.out.print(" " + m.group(1) + " " );
    System.out.print(" " + m.group(2) + " " );
System.out.print(" " + m.group(3) + " " );
System.out.println(" " + m.group(4));

Ожидаемый результат:

srcip=10.100.1.121 dstip=173.193.156.43 srcport=55844 status=close dstport=80  

Но это результат, который я получаю:

srcip=10.100.1.121  dstip=173.193.156.43  dstip=173.193.156.43  dstport=80
srcip=10.100.1.121  dstip=173.193.156.43  dstip=173.193.156.43  dstport=80

Какие-либо предложения?

Теги:
matcher

1 ответ

1

Порядок ваших групп захвата не соответствует порядку полей на входе. Ниже приведена перезагруженная версия вашего регулярного выражения, которая ловит 5 групп, которые вам нужны:

String s = "subtype=forward,level=notice,vd=root,srcip=10.100.1.121,srcport=55844,srcintf=port1,dstip=173.193.156.43,dstport=80,dstintf=port16,sessionid=1224203695,status=close";

Pattern p = Pattern.compile("(srcip=(?:\\d+\\.)+\\d+)(?:.*)?(srcport=(?:\\d+))(?:.*)?(dstip=(?:\\d+\\.)+\\d+)(?:.*)?(dstport=(?:\\d+))(?:.*)?(status=(?:.*))");
Matcher m = p.matcher(s);

if (m.find()) {
  System.out.println(m.group(1) + " " + m.group(3) + " " + m.group(2) + " " + m.group(5) + " " + m.group(4));
}

Обратите внимание, что я также зафиксировал незакрытую группу и сделал одну из групп без захвата.

  • 0
    спасибо большое Eyal
  • 0
    но это дает полную строку журнала в качестве вывода
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню