我正在尝试拆分一个如下所示的日志行:
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
并做了一个子串。它起作用,但并不完美,因为有时第二次拆分更长或更短,看起来不是一个好的解决方案。
我想知道是否有可能实际上用正则表达式分割该字符串。我是regex的新手,我没有找到一种方法来编写一个处理我的目标的表达式。
(?:> [^:]+: |\d+=|[ ,|<>])+
(?:)+
匹配以下任何一个或多个选项
> [^:]+:
匹配>
,然后一个或多个除:
之外的任何角色,然后:
\d+=
匹配一个或多个数字,然后=
[ ,|<>]
匹配集合中的任何角色结果:
15:10:10
408
INFO
NioProcessor-11
FIXT.1.1
317
D
verifix
如果您搜索通用解决方案,这可能会有所帮助
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);
但是如果要获取指定的元素,请使用组和特定模式。
@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));
}
正则表达式:(?:> Raw Message: |\|)?(?:\d+=|[ ,<|]+)
细节:
(?:> Raw Message: |\|)?
非捕获组(?:)
匹配> Raw Message:
或|
管\|
如果他们存在?
(?:\d+=|[ ,<|]+)
非捕获组(?:)
匹配数字一次或无限次\d+
或|
匹配列表中的单个字符[ ,<|]+
一次或无限次+
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