我有一個這樣的字符串:分割字符串返回只有後者部分
abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;
我想在第一次分裂;然後在: 最後輸出應該是隻有後者的部分周圍:即我的輸出應該是
def, ghi, jkl, pqr, stu, yza,aaa,bbb
這可以通過拆分與;
兩次,即一次完成,然後用:
然後模式匹配只要找到:
旁邊的右側部分。 Howvever,有沒有更好的和優化的解決方案來實現這一點?
我有一個這樣的字符串:分割字符串返回只有後者部分
abc:def,ghi,jkl;mno:pqr,stu;vwx:yza,aaa,bbb;
我想在第一次分裂;然後在: 最後輸出應該是隻有後者的部分周圍:即我的輸出應該是
def, ghi, jkl, pqr, stu, yza,aaa,bbb
這可以通過拆分與;
兩次,即一次完成,然後用:
然後模式匹配只要找到:
旁邊的右側部分。 Howvever,有沒有更好的和優化的解決方案來實現這一點?
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(":")
來確定「正確部分」。
所以基本上你想獲取;
和:
之間的內容,與:
左側和;
在右邊。
你可以使用這個表達式: -
"(?<=:)(.*?)(?=;)"
這包含:
一個look-behind
和;
一個look-ahead
。並匹配前面有colon(:)
的字符串,然後是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(",")));
OUTPUT: -
def,ghi,jkl, pqr,stu, yza,aaa,bbb
+1,更優雅 –
有沒有一種工具可以生成RegexExplanation部分,還是您手動輸入的?一個工具對初學者非常有用。 –
@CoryKendall ..我只用手輸入。但是有很多在線的'正則表達式'資源。我想你可以谷歌了。你會得到很多。 :) –
請附上您的代碼,否則你的問題是關閉主題(如[fa Q])。 – Adam
我建議使用正則表達式而不是split.Agree和Rohit Jain的答案。 – Raghunandan
@ user1703096,你通常不接受答案。太糟糕了! – TheBlastOne