我通过分解无意义的部分并将其拆分为仅包含有用部分的数组来分解条件字符串,如下所示:

String s1="01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;";
System.out.println(s1);
String [] s2 = s1.split("([\\d]{2,3}?(:IF))?[\\s,&]+(with)?");
for(int i=0;i<s2.length;i++)System.out.println(s2[i]);


“ 01:IF”,“ with”,“&”和任何空格都是分隔符,需要消除。执行结果为:

01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;
          <--- un wonted space
rd.h
dq.L
o.LL
v.L
THEN
la.VHB
av.VHR
          <--- un wonted space
0.4610;


该空格在拆分字符串中显示为第一个和第九个元素。如何摆脱这些多余的空间?另外,我需要更多好的示例来说明如何利用split.regex中提到的不同选项,以及如何将它们组合到一个正则表达式中。大多数堆栈溢出中的大多数答案都基于一个分隔符,没有复杂的插图组合。
谢谢。

最佳答案

使用PatternMatcher类可以实现相同的目的。

String s1="01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;";
Matcher m = Pattern.compile("(?:\\d{2,3}?(?::IF))?[\\s,&]+(?:with)?|(\\S+)").matcher(s1);
while(m.find())
{
    if(m.group(1) != null)
    System.out.println(m.group(1));
}


我只是将正则表达式中存在的所有捕获组转换为非捕获组,并在最后添加了一个额外的|(\\S+),这意味着仅对其余字符串(匹配的字符除外)进行匹配。 (\\S+)捕获一个或多个非空格字符。

输出:

rd.h
dq.L
o.LL
v.L
THEN
la.VHB
av.VHR
0.4610;


DEMO

10-06 13:23
查看更多