2

我有一个这样的字符串:

abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;

我想先拆分;然后继续:最后输出应该只是后半部分:即我的输出应该是

def, ghi, jkl, pqr, stu, yza,aaa,bbb

这可以使用 Split 两次来完成,即一次使用;,然后使用:,然后模式匹配以找到 . 旁边的正确部分:。但是,是否有更好和优化的解决方案来实现这一目标?

4

3 回答 3

6

所以基本上你想获取和之间的内容;::左边和;右边。

你可以使用这个正则表达式: -

"(?<=:)(.*?)(?=;)"

这包含一个look-behindfor:和一个look-aheadfor ;。并匹配前面有 acolon(:)和后面有 a的字符串semi-colon (;)

正则表达式解释:-

(?<=         // Look behind assertion.
    :        // Check for preceding colon (:)
)            
(            // Capture group 1
    .        // Any character except newline
    *        // repeated 0 or more times
    ?        // Reluctant matching. (Match shortest possible string)
)
(?=          // Look ahead assertion
    ;        // Check for string followed by `semi-colon (;)`
)

这是工作代码: -

   String str = "abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;";

   Matcher matcher = Pattern.compile("(?<=:)(.*?)(?=;)").matcher(str);

   StringBuilder builder = new StringBuilder();
   while (matcher.find()) {
       builder.append(matcher.group(1)).append(", ");
   }

   System.out.println(builder.substring(0, builder.lastIndexOf(",")));

输出: -

def,ghi,jkl, pqr,stu, yza,aaa,bbb
于 2012-11-13T12:17:13.233 回答
3
String[] tabS="abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;".split(";");
StringBuilder sb = new StringBuilder();
Pattern patt = Pattern.compile("(.*:)(.*)");
String sep = ",";
for (String string : tabS) {
    sb.append(patt.matcher(string).replaceAll("$2 ")); // ' ' after $2 == ';' replaced
    sb.append(sep);
}
System.out.println(sb.substring(0,sb.lastIndexOf(sep)));

输出

def,ghi,jkl ,pqr,stu ,yza,aaa,bbb 
于 2012-11-12T10:40:05.807 回答
0

除非必须在 Java 中进行,否则不要进行模式匹配;如果您不能在字段名称中包含“:”字符(在您的示例中为 abc),您可以使用它indexOf(":")来找出“正确的部分”。

于 2012-11-13T08:33:47.907 回答