Duplicate delimiter in java with broken message to array
I have a line:
String received = "28,gZrate:-1.48},
{gXrate:9.10,gYrate:-0.69,gZrate:-1.50},
{gXrate:9.22,gYrate:0.54,gZrate:-1.67},
{gXrate:9.20,gYrate:-2.40,gZrate:-1.65},{gXrate:9.02" ;
I need this string in an array like this:
["gXrate:9.10,gYrate:-0.69,gZrate:-1.50","gXrate:9.22,gYrate:0.54,gZrate:-1.67","gXrate:9.20,gYrate:-2.40,gZrate:-1.65"]
neglecting the broken part of the accepted string at the beginning and end viz.
28,gZrate:-1.48}
{gXrate:9.02 ;
also note that the line may not be interrupted.
+3
source to share
3 answers
You can use regex:
import java.util.regex.*;
import java.util.Arrays;
import java.util.ArrayList;
public class Main {
public static void main (String[] args) {
ArrayList<String> nonBrokenStrings = new ArrayList<String>();
String received = "28,gZrate:-1.48},{gXrate:9.10,gYrate:-0.69,gZrate:-1.50}, {gXrate:9.22,gYrate:0.54,gZrate:-1.67}, {gXrate:9.20,gYrate:-2.40,gZrate:-1.65},{gXrate:9.02";
Matcher m = Pattern.compile("\\{([^}]+)\\}").matcher(received);
while(m.find()) {
nonBrokenStrings.add(m.group(1));
}
String[] nonBrokenStringsArr = nonBrokenStrings.toArray(new String[nonBrokenStrings.size()]);
System.out.print(Arrays.toString(nonBrokenStringsArr));
}
}
Output:
[gXrate:9.10,gYrate:-0.69,gZrate:-1.50, gXrate:9.22,gYrate:0.54,gZrate:-1.67, gXrate:9.20,gYrate:-2.40,gZrate:-1.65]
Try it here!
+1
source to share
String received = "28,gZrate:-1.48},{gXrate:9.10,gYrate:-0.69,gZrate:-1.50},";
received += "{gXrate:9.22,gYrate:0.54,gZrate:-1.67},";
received += "{gXrate:9.20,gYrate:-2.40,gZrate:-1.65},{gXrate:9.02";
String pattern = "\\{(.*?)\\},?";
StringBuilder sb = new StringBuilder("[");
boolean first = true;
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(received);
while (m.find()) {
if (!first) {
sb.append(",");
}
first = false;
sb.append("\"" + m.group(1) + "\"");
}
sb.append("]");
System.out.println(sb);
Output:
["gXrate:9.10,gYrate:-0.69,gZrate:-1.50","gXrate:9.22,gYrate:0.54,gZrate:-1.67","gXrate:9.20,gYrate:-2.40,gZrate:-1.65"]
Here's a demo that shows that the above code works for both broken and balanced cases:
Rextester
+1
source to share
public static String formatToArrayStr(String input){
String regex="\\{([^}]+)\\}";
Matcher m=Pattern.compile(regex).matcher(input);
StringBuilder result=new StringBuilder().append("[");
while(m.find()){
result.append("\"").append(m.group(1)).append("\"").append(",");
}
result=(result.lastIndexOf(",")>=0?result.deleteCharAt(result.length()-1):result).append("]");
return result.toString();
}
also you can write like below:
public static String formatToArrayStr(String input){
Matcher m=Pattern.compile("\\{([^}]+)\\}").matcher(input);
List<String> result=new ArrayList<String>();
while(m.find()){
result.add("\""+m.group(1)+"\"");
}
return result.toString();
}
Output
["gXrate:9.10,gYrate:-0.69,gZrate:-1.50","gXrate:9.22,gYrate:0.54,gZrate:-1.67","gXrate:9.20,gYrate:-2.40,gZrate:-1.65"]
0
source to share