在Java中解析IBM服务器错误消息

时间:2015-07-16 20:19:03

标签: java regex

我有一个需要解析的错误消息。

DSNL027I  AGENTNAME SERVER DISTRIBUTED AGENT WITH
        LUWID=XX00000.X000.XX0000000X00=00000
        THREAD-INFO=XXXX00:255.255.255.255:XXXX00:application_name:*:*:*:*
        RECEIVED ABEND=00X
        FOR REASON=00000000

我需要解析数以千计的这些消息。它们都遵循类似下面的模式。

DSNL027I agent-type DISTRIBUTED AGENT WITH 
        LUWID luw-id=token 
        THREAD-INFO thread-information 
        RECEIVED ABEND=abend-code 
        FOR REASON=reason-code

此外,这些模式都可以在IBM文档站点上找到。

http://www-01.ibm.com/support/knowledgecenter/SSEPEK_10.0.0/com.ibm.db2z10.doc.msgs/src/msgs/db2z_msgs.dita

我需要捕获此消息中的所有字段并创建XML对象,下面是给定错误消息的示例。

    <agent-type>AGENTNAME</agent-type>
    <luwid>XX00000.X000.XX0000000X00</luwid>
    <token>00000</token>
    <thread-information>XXXX00:255.255.255.255:XXXX00:application_name:*:*:*:*</thread-information>
    <abend-code>00X</abend-code>
    <reason-code>00000000</reason-code>

使用正则表达式匹配消息很容易,也很有意义。

是否有一个简单的编程方法可以采用模式(小写字符)并在实际消息中提取相应的值?

2 个答案:

答案 0 :(得分:1)

试试这个:

\S* (\S*) DISTRIBUTED AGENT WITH\s*LUWID (\S*)=(\S*)\s*THREAD-INFO (\S*)\s*RECEIVED ABEND=(\S*)\s*FOR REASON=(\S*)$

(注意:在Java中,你将使用双反斜杠来转义字符:\\

替换为:

<agent-type>$1</agent-type>\n<luwid>$2</luwid>\n<token>$3</token>\n<thread-information>$4</thread-information>\n<abend-code>$5</abend-code>\n<reason-code>$6</reason-code>

输出:

<agent-type>agent-type</agent-type>
<luwid>luw-id</luwid>
<token>token</token>
<thread-information>thread-information</thread-information>
<abend-code>abend-code</abend-code>
<reason-code>reason-code</reason-code>

在此处使用它:https://regex101.com/r/yY2aM6/2

答案 1 :(得分:1)

我写了一堂课来解决你的问题:

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

public class Regex {

    public static String escape(final String pattern) {
        return Pattern.quote(pattern);
    }

    public static String[] getLines(final String arg) {
        if (arg == null) {
            return new String[] {};
        }
        else {
            final String[] temp = arg.split("[\r\n]{1,2}");
            final int tempLength = temp.length;
            final String[] output = new String[tempLength];
            for (int i = 0; i < tempLength; i++) {
                output[i] = new String(temp[i].trim());
            }
            return output;
        }
    }

    public static boolean matches(final Object str, final Pattern pat) {
        return new Regex(str, pat).matches();
    }

    public static boolean matches(final Object page, final String string) {
        return new Regex(page, string).matches();
    }

    public static String replace(final String text, final String regex, final String replacement) {

        return Pattern.compile(regex, Pattern.DOTALL | Pattern.MULTILINE).matcher(text).replaceAll(replacement);
    }

    private Matcher matcher;

    private boolean memOpt = true;

    public Regex(final Matcher matcher) {
        if (matcher != null) {
            this.matcher = matcher;
        }
    }

    public Regex(final Object data, final Pattern pattern) {
        this(data.toString(), pattern);
    }

    public Regex(final Object data, final String pattern) {
        this(data.toString(), pattern);
    }

    public Regex(final Object data, final String pattern, final int flags) {
        this(data.toString(), pattern, flags);
    }

    public Regex(final String data, final Pattern pattern) {
        if (data != null && pattern != null) {
            this.matcher = pattern.matcher(data);
        }
    }

    public Regex(final String data, final String pattern) {
        if (data != null && pattern != null) {
            this.matcher = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL).matcher(data);
        }
    }

    public Regex(final String data, final String pattern, final int flags) {
        if (data != null && pattern != null) {
            this.matcher = Pattern.compile(pattern, flags).matcher(data);
        }
    }

    public int count() {
        if (this.matcher == null) {
            return 0;
        }
        else {
            this.matcher.reset();
            int c = 0;
            final Matcher matchertmp = this.matcher;
            while (matchertmp.find()) {
                c++;
            }
            return c;
        }
    }

    public String[] getColumn(int x) {
        if (this.matcher == null) {
            return null;
        }
        else {
            x++;
            final Matcher matcher = this.matcher;
            matcher.reset();

            final java.util.List<String> ar = new ArrayList<String>();
            while (matcher.find()) {
                String tmp = matcher.group(x);
                if (tmp != null && this.memOpt) {
                    tmp = new String(tmp);
                }
                ar.add(tmp);
            }
            return ar.toArray(new String[ar.size()]);
        }
    }

    public String getMatch(final int group) {
        if (this.matcher != null) {
            final Matcher matcher = this.matcher;
            matcher.reset();
            if (matcher.find()) {
                final String ret = matcher.group(group + 1);
                if (ret != null && this.memOpt) {
                    return new String(ret);
                }
                return ret;
            }
        }
        return null;
    }

    public String getMatch(int entry, final int group) {
        if (this.matcher != null) {
            final Matcher matcher = this.matcher;
            matcher.reset();
            // group++;
            entry++;
            int groupCount = 0;
            while (matcher.find()) {
                if (groupCount == group) {
                    final String ret = matcher.group(entry);
                    if (ret != null && this.memOpt) {
                        return new String(ret);
                    }
                    return ret;
                }
                groupCount++;
            }
        }
        return null;
    }

    public Matcher getMatcher() {
        if (this.matcher != null) {
            this.matcher.reset();
        }
        return this.matcher;
    }

    public String[][] getMatches() {
        if (this.matcher == null) {
            return null;
        }
        else {
            final Matcher matcher = this.matcher;
            matcher.reset();
            final java.util.List<String[]> ar = new ArrayList<String[]>();
            while (matcher.find()) {
                final int c = matcher.groupCount();
                int d = 1;
                String[] group;
                if (c == 0) {
                    group = new String[c + 1];
                    d = 0;
                }
                else {
                    group = new String[c];
                }

                for (int i = d; i <= c; i++) {
                    String tmp = matcher.group(i);
                    if (tmp != null && this.memOpt) {
                        tmp = new String(tmp);
                    }
                    group[i - d] = tmp;
                }
                ar.add(group);
            }
            return ar.size() == 0 ? new String[][] {} : ar.toArray(new String[][] {});
        }
    }

    public String[] getRow(final int y) {
        if (this.matcher != null) {
            final Matcher matcher = this.matcher;
            matcher.reset();
            int groupCount = 0;
            while (matcher.find()) {
                if (groupCount == y) {
                    final int c = matcher.groupCount();

                    final String[] group = new String[c];

                    for (int i = 1; i <= c; i++) {
                        String tmp = matcher.group(i);
                        if (tmp != null && this.memOpt) {
                            tmp = new String(tmp);
                        }
                        group[i - 1] = tmp;
                    }
                    return group;
                }
                groupCount++;
            }
        }
        return null;
    }

    public boolean matches() {
        final Matcher matcher = this.matcher;
        if (matcher == null) {
            return false;
        }
        else {
            matcher.reset();
            return matcher.find();
        }
    }

    public void setMatcher(final Matcher matcher) {
        this.matcher = matcher;
    }

    public Regex setMemoryOptimized(final boolean t) {
        this.memOpt = t;
        return this;
    }

    @Override
    public String toString() {
        final StringBuilder ret = new StringBuilder();
        final String[][] matches = this.getMatches();
        final int matchesLength = matches.length;
        String[] match;
        int matchLength;
        for (int i = 0; i < matchesLength; i++) {
            match = matches[i];
            matchLength = match.length;
            for (int j = 0; j < matchLength; j++) {
                ret.append("match[");
                ret.append(i);
                ret.append("][");
                ret.append(j);
                ret.append("] = ");
                ret.append(match[j]);
                ret.append(System.getProperty("line.separator"));
            }
        }
        this.matcher.reset();
        return ret.toString();
    }

}

在这里,您可以使用括号创建复杂的RegEx来创建节,并使用方法getMatch(int i)来提取您的信息:

private static final String PATTERN_ESTACION_ID = "(SALIDA DE[ ]*)(.{1,5})(:[ ]*)([a-zA-Z]*)";  
Regex regex = new Regex(stringConsist, PATTERN_ESTACION_ID);
String tipoMovimiento = regex.getMatch(3).trim();
String estacion = regex.getMatch(1);

括号计数器从0开始。

我希望它可以帮到你。