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

时间:2015-01-20 12:00:29

标签: java regex string

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

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

&#34; 01:IF&#34;,&#34;&#34;,&#34;&amp;&#34;任何白色空间都是分隔符,需要消除。执行结果是:

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中提到的不同选项的好例子,以及如何将它们组合在一个正则表达式中。堆栈溢出中的大多数答案都基于一个分隔符,没有与插图存在复杂组合。 谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用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+),这意味着仅匹配剩余的字符串(除了匹配的字符< / em>的)。 (\\S+)捕获一个或多个非空格字符。

输出:

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

DEMO

答案 1 :(得分:0)

我会使用不同的策略而不是拆分和消毒。

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

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,每行一个匹配。