如何根据字符串和空格和符号的组合进行拆分?

How to split bas on cmbination of strings and white spaces and symbols?

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

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"、“&”和任何白色的 space 都是分隔符,需要删除。执行结果为:

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;

space 在拆分字符串中显示为第一个和第九个元素。我怎样才能摆脱这些额外的 spaces?此外,我需要更多关于如何使用 split.regex 中提到的不同选项以及如何将它们组合到一个正则表达式中的好例子。大多数 Stack Overflow 中的答案都是基于一个分隔符,不存在带有插图的复杂组合。 谢谢。

我会使用不同的策略而不是拆分和清理。

假设您想要的输出中列出的实体代表您愿意保留的所有模式:

String test = "01:IF   rd.h && dq.L && o.LL && v.L THEN la.VHB , av.VHR with 0.4610;";
//                           | positive look behind for start of input or whitespace
//                           |          | "rd.h" etc.
//                           |          |                        | OR
//                           |          |                        | | "0.4610;" etc.
//                           |          |                        | |           | Positive lookahead for end of input or whitespace
Pattern p = Pattern.compile("(?<=^|\s)(\p{Alpha}+\.\p{Alpha}+|\d+\.\d+;)(?=\s|$)");
Matcher m = p.matcher(test);
StringBuilder result = new StringBuilder();
while (m.find()) {
   result.append(m.group()).append(System.getProperty("line.separator"));
}
System.out.println(result);

输出

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

说明

  • 这里的 Pattern 查找正匹配而不是清理和拆分。
  • 它包括"rd.h"等的模式,“0.4160”等的模式,尽可能概括。
  • 然后它遍历匹配项并构建一个具有所需输出的 ​​String,每行一个匹配项。

您可以使用 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+) 捕获一个或多个非 space 字符。

输出:

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

DEMO