2

次のような文字列があります。

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

最初に分割したい ; そして次に:最後に、出力は後半部分のみになるはずです:つまり、私の出力は

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

これは、Split を 2 回使用して実行できます。つまり、1 回;、次に を使用し:、次にパターン マッチを使用して、 の隣にある適切な部分を見つけます:。ただし、これを達成するためのより優れた最適化されたソリューションはありますか?

4

3 に答える 3

6

したがって、基本的には、 と の間のコンテンツを取得する必要が;あり::左側と;右側にあります。

この正規表現を使用できます: -

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

これにはlook-behindfor:look-aheadforが含まれ;ます。And は、前に a がcolon(:)あり、後ろに 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 に答える