Regular expresion znalesc &

0

Cześć mam string
"key=value&key=value&key=value&key=value", nie mogę znieść info jak wyszukać za pomoca znaku '&'.

regular podałem tak (\w+=\w+)&? i nie znajduje.
Generalnie zadanie polega na tym, że mam zmapować podany string ( z url-a ) na parę klucz/wartość. Ale zanim to dzieło się dokona to należy sprawdzić najpierw czy string ma odpowiedni format jak nie to wywalamy exeption.

0

Znajduje - odpal sobie np. na regex101 - (poza ostatnią parą, rzecz jasna, ponieważ nie kończy się ona & - czyli musiałbyś mieć regexa w formie (\w+=\w+)&?, aby złapać wszystko).

Inna sprawa, że wykorzystywanie w tym celu wyrażeń regularnych to niezły overkill ;-)

mam sprawdzić za pomoca patterna czy string znaków sprawdza wytyczne,

Spróbuj napisać to zdanie po polsku.

0
Patryk27 napisał(a):

Znajduje - odpal sobie np. na regex101 - (poza ostatnią parą, rzecz jasna, ponieważ nie kończy się ona & - czyli musiałbyś mieć regexa w formie (\w+=\w+)&?, aby złapać wszystko).

Inna sprawa, że wykorzystywanie w tym celu wyrażeń regularnych to niezły overkill ;-)

mam sprawdzić za pomoca patterna czy string znaków sprawdza wytyczne,

Spróbuj napisać to zdanie po polsku.

Poprawiłem :)

0

Mam cos takiego zapisanego
if(Pattern.matches("(\w+=\w+)&?", wad))
{
System.out.println("lol");
}

No nie działa.

0

Ponieważ Twoje wyrażenie wyszuka pojedyncze wystąpienie key=value.

IMO powinno być coś tego typu:

Pattern.matches("(\w+=\w+&)*(\w+=\w+)", wad)

Dowolna ilość razy key=value& i na końcu key=value bez &

Jeżeli się nie kompiluje to zamiast \ wszędzie powstawiaj \\

0

((\w+)?=(\w+)?+&)*((\w+)?=(\w+)?) takie coś mi działa a tak przy okazji to mam w tym zadaniu zrobić mapowanie a do tego mam wykorzystać interfejs i zaimplementować podana metode

import java.util.Map;

public class MyMapDecoder implements MapDecoder
{
    @Override
    public Map<String, String> decode(String s)
    {
        return null;
    }
}

i w zadaniu pisze
Empty keys and values are allowed, but the equals sign must be present (e.g. "=value", "key=").
If the key or value is empty, empty String should be returned.

jak zwrócić pusty string z metoda co zwraca mape (powyżej)

1

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
0
Koziołek napisał(a):

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
0

Powiem bardzo elegancko. Nie mam pojęcia nic o JAVIE rozwiązywałem zadanie z Javy na staż. Metoda jest narzucona i musi być zaimplementowana, Dzięki wielkie

0
Nadziany Rycerz napisał(a):

Powiem bardzo elegancko. Nie mam pojęcia nic o JAVIE rozwiązywałem zadanie z Javy na staż. Metoda jest narzucona i musi być zaimplementowana, Dzięki wielkie
A zapomniałe dodać że w zadaniu dopuszczalny jest taki striong "=Value&Key=", czyli może nie być wartości lub klucza.

0

rozwiązywałem zadanie z Javy na staż

No to chyba jasne jest że na ten staż sie nie nadajesz. Po co więc cała ta farsa?

0

Proste szukają kogo kogokolwiek. Z funduszy to jest.

0

Inna wersja, też z użyciem wyrażeń regularnych:


import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		String test = "key=value&key=value&key=value&key=value&key5=&=value6";
		String[] params = test.split("&");
		for(String paramKeyValue: params) {
			String[] paramPair = paramKeyValue.split("=");
			if (paramPair.length > 0 && paramPair.length <= 2) {
  			  String paramKey = paramPair[0];
  			  String paramValue = paramPair.length > 1 ? paramPair[1] : "";
			  System.out.printf("Param %s = %s%n", paramKey, paramValue);;
			} else {
			  throw new IllegalArgumentException(String.format("Illegal argument: [%s]", paramKeyValue));
			}
		}
	}
}

http://ideone.com/mrQa18

Edit: dodałem walidację.

1 użytkowników online, w tym zalogowanych: 0, gości: 1