我努力分解条件字符串,如下所示,通过删除无意义的部分并将其拆分为仅包含有用部分的数组,如:
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中提到的不同选项的好例子,以及如何将它们组合在一个正则表达式中。堆栈溢出中的大多数答案都基于一个分隔符,没有与插图存在复杂组合。 谢谢。
答案 0 :(得分:2)
您可以使用Pattern
和Matcher
类来实现相同的目标。
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;
答案 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
寻找积极的匹配,而不是消毒和分裂。 String
,每行一个匹配。