Моя строка ввода:
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
Какие-либо предложения?
Порядок ваших групп захвата не соответствует порядку полей на входе. Ниже приведена перезагруженная версия вашего регулярного выражения, которая ловит 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));
}
Обратите внимание, что я также зафиксировал незакрытую группу и сделал одну из групп без захвата.