我有一个这样的字符串:
abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;
我想先拆分;然后继续:最后输出应该只是后半部分:即我的输出应该是
def, ghi, jkl, pqr, stu, yza,aaa,bbb
这可以使用 Split 两次来完成,即一次使用;
,然后使用:
,然后模式匹配以找到 . 旁边的正确部分:
。但是,是否有更好和优化的解决方案来实现这一目标?
所以基本上你想获取和之间的内容;
,:
在:
左边和;
右边。
你可以使用这个正则表达式: -
"(?<=:)(.*?)(?=;)"
这包含一个look-behind
for:
和一个look-ahead
for ;
。并匹配前面有 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
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
除非必须在 Java 中进行,否则不要进行模式匹配;如果您不能在字段名称中包含“:”字符(在您的示例中为 abc),您可以使用它indexOf(":")
来找出“正确的部分”。