Ale nakombinowane... Po pierwsze sam wzorzec może być bardzo prosty ([\w]*=[\w]*\&?|[\w]*&?)
co otwiera nam drogę do wyszukiwania po grupach:
public static void main(String[] args) {
final Pattern regexp = Pattern.compile("([\\w]*=[\\w]*&?|[\\w]*&?)");
final String params = "key=value&key2=value2&key3=value3&key4=value4&key5&=value6";
Matcher matcher = regexp.matcher(params);
while(matcher.find()) {
matcher.start(0);
matcher.end(0);
System.out.println(
matcher.group(0)
);
}
}
, ale tak się tego nie robi.
String params = "key=value&key=value&key=value&key=value&key&=value"; // łącznie z pustym kluczem i pustą wartością
Arrays.stream(
params.split("\&")
) // w tym miejscu mamy strumień par klucz=wartość
.map(kv -> {
int i = kv.indexOf('=');
int idxOf = i == -1 ? kv.length() : i;
return new String[]{
kv.substring(0, idxOf),
kv.substring(idxOf, kv.length()).replace("=","")
};
}
)
.map(Arrays::toString)
.forEach(System.out::println); // poglądowo sobie wypisujesz