【问题标题】:split java log line with regex用正则表达式拆分 java 日志行
【发布时间】:2018-08-11 02:37:17
【问题描述】:

我正在尝试拆分如下所示的日志行:

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

拆分中的每个信息。

我尝试使用 split 函数将其拆分,只有

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 并做一个子串。它有效,但并不完美,因为有时第二次拆分会更长或更短,而且看起来不是一个好的解决方案。

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

【问题讨论】:

  • 如果您可以在日志文件中提及更多日志行示例,将会很有帮助。目前,它只提到了一种日志模式。
  • 单次拆分怎么样[, &lt;&gt;]|(?: Raw Message: )?\|?\d+=|\|
  • 是的 ctwheels 它对你有用

标签: java regex


【解决方案1】:

正则表达式(?:&gt; Raw Message: |\|)?(?:\d+=|[ ,&lt;|]+)

详情:

  • (?:&gt; Raw Message: |\|)?非捕获组(?:)匹配&gt; Raw Message:|管道\|如果它们存在?
  • (?:\d+=|[ ,&lt;|]+) 非捕获组 (?:) 匹配数字一次或无限次 \d+ | 匹配列表中存在的单个字符 [ ,&lt;|]+ 一次或无限次 +

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);
}

输出:

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

Code demo

【讨论】:

  • @alaaeddine zammel 多多练习!
  • 任何链接或来源?
  • @alaaeddine 只是谷歌。您可以在此处使用标签“正则表达式”进行搜索,并找到许多您可以自行解决的简单示例。使用regex101 作为练习工具。
  • 谢谢你,抱歉不能对你的回复投赞成票~~因为我是新手,我会谷歌:)
  • @alaaeddine zammel 没问题。很高兴我能帮助你。请参阅 SO 的 regex 部分。
【解决方案2】:

See regex in use here

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

结果:

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

【讨论】:

    【解决方案3】:

    @alaaeddine zammel 更具体

        final String input = "8=FIXT.1.1|9=317";
        final String groupPattern = "\\d=([A-Z\\.\\d]*)\\|\\d=([A-Z\\.\\d]*)";
        final Pattern p = Pattern.compile(groupPattern);
        final Matcher m = p.matcher(input);
        if (m.matches()) {
            System.out.println(m.group(1));
            System.out.println(m.group(2));
        }
    

    【讨论】:

      【解决方案4】:

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

          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);
      

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

      【讨论】:

      • 感谢您的询问,因此您的模式拆分他是否找到(','空格或管道)如果我想拆分这些 8=FIXT.1.1|9=317 而没有那些 8= & 9 = =to=> FIXT.1.1 和 317 .. 有没有办法?
      • 有很多关于正则表达式的工具,可以搜索“regex coach”或“regex tester”并使用您最喜欢的那个。即使对于 IDE(例如 Eclipse)也有插件
      • youtube.com/…查看本课程
      猜你喜欢
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      • 2019-02-09
      • 1970-01-01
      相关资源
      最近更新 更多