Regular expresion znalesc &

Regular expresion znalesc &
WA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:39
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.

edytowany 1x, ostatnio: wad
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
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.


edytowany 2x, ostatnio: Patryk27
WA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:39
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 :)

WA
  • Rejestracja:prawie 11 lat
  • Ostatnio:ponad 6 lat
  • Postów:39
0

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

No nie działa.

edytowany 1x, ostatnio: wad
Grzyboo
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:206
0

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

IMO powinno być coś tego typu:

Kopiuj
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 \\

edytowany 2x, ostatnio: Grzyboo
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

Kopiuj
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)

Koziołek
Moderator
  • Rejestracja:około 18 lat
  • Ostatnio:24 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
1

Ale nakombinowane... Po pierwsze sam wzorzec może być bardzo prosty ([\w]*=[\w]*\&?|[\w]*&?) co otwiera nam drogę do wyszukiwania po grupach:

Kopiuj
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.

Kopiuj
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

Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException
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:

Kopiuj
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.

Kopiuj
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.

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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?


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Koziołek
Też takie coś robiliśmy. Zatrudniasz ludzi, który choć trochę ogarniają, a potem ich uczysz i sprzedajesz do klienta jako juniorów z 3-6 miesiącami doświadczenia. Obecnie w PL standard.
0

Proste szukają kogo kogokolwiek. Z funduszy to jest.

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

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

Kopiuj

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ę.

edytowany 3x, ostatnio: vpiotr
Zobacz pozostałe 2 komentarze
Koziołek
@vpiotr: key=value=value- warunek w if-ie ;) ale to są drobnostki w sumie
vpiotr
@Koziołek: wybacz, ale nie zrozumiałem
Koziołek
@vpiotr: jak masz zapis w postaci key=value=value, t ten drugi splitzwróci tablicę o trzech elementach i wejdziesz w ifa, ale wyprodukujesz głupotę, bo dopuścisz coś co powinno wywalić błąd.
vpiotr
@Koziołek: a nie, w sumie racja
Koziołek
W sumie racja...

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.