用正则表达式拆分java日志行

时间:2018-03-02 20:09:33

标签: java regex

我试图分割一个如下所示的日志行:

15:10:10,408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1|9=317|35=D|49=verifix|

这样的事情:

15:10:10 
408
INFO
NioProcessor-11
FIXT.1.1
317
D
verifix

拆分中的每个信息。

我试图用仅具有

的分割功能将其拆分

mystring.split((,)| \\\|)将我的代码拆分为:

15:10:10
408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1
9=317
35=D
49=verifix

然后我进行了第二次分割408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1 并做一个子串。它起作用,但并不完美,因为有时候第二次拆分更长或更短,并且看起来不是一个好的解决方案。

我想知道是否有可能实际上用正则表达式分割该字符串。我是正则表达式的新手,我没有找到一种方法来编写一个能够处理我的目标的表达式。

4 个答案:

答案 0 :(得分:1)

See regex in use here

(?:> [^:]+: |\d+=|[ ,|<>])+
  • (?:)+一次或多次匹配以下任何选项
    • > [^:]+:匹配> ,然后匹配:以外的任何字符中的一个或多个,然后:
    • \d+=匹配一个或多个数字,然后=
    • [ ,|<>]匹配集合中的任何字符

结果:

15:10:10
408
INFO
NioProcessor-11
FIXT.1.1
317
D
verifix

答案 1 :(得分:0)

如果您搜索通用解决方案,这可能会有所帮助

    final String first = "15:10:10,408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1|9=317|35=D|49=verifix|";
    final String second = "408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1";

    String pattern = "[,| ]";
    Arrays.stream(first.split(pattern)).forEach(System.out::println);
    System.out.println("--------------------------");
    Arrays.stream(second.split(pattern)).forEach(System.out::println);

但如果您想获取指定的元素,请使用组和特定模式。

答案 2 :(得分:0)

正则表达式(?:> Raw Message: |\|)?(?:\d+=|[ ,<|]+)

详细说明:

  • (?:> Raw Message: |\|)?非捕获论坛(?:)匹配> Raw Message: |管道\|如果存在?
  • (?:\d+=|[ ,<|]+)非捕获群组(?:)匹配数字一次或无限次\d+ |匹配列表中的单个字符{ {1}}一次或无限次[ ,<|]+

Java代码

+

输出:

String test = "15:10:10,408 INFO <NioProcessor-11> Raw Message: 8=FIXT.1.1|9=317|35=D|49=verifix|";
String[] data =test.split("(?:> Raw Message: |\\|)?(?:\\d+=|[ ,<|]+)");
for(String r : data) {
    System.out.println(r);
}

Code demo

答案 3 :(得分:0)

@alaaeddine zammel更具体

{'1':'3',
 '111':'333',
 '11':'33'}