2016-04-05 13 views
1

Ich habe einen regulären AusdruckRegular Expression eindeutiges Ergebnis

(?:(da|en-gb|en|\*))(?!.*\1) 

Was will ich erreichen ist einzigartig Sprache Typ entsprechen;

Zum Beispiel gebe ich enenen-gben das Spiel Teil en-gben ist, das ist, was ich will, weil die ersten beiden en wiederholt werden.

Jedoch, wenn ich gebe enenenen-gb das Spiel Teil ist en-gb, was mir, was enen-gb zu bekommen, ich glaube, der Grund dafür ist, dass en ein Teil von en-gb ist. Aber ich weiß nicht, wie ich das beheben soll. Kann mir jemand einen besseren RE geben? Vielen Dank

=================== Update ==============

Der Hintergrund der Frage ist, dass ich einen Regex für den HTTP-Header von accept-language entwerfen möchte. Also verwende ich (?:(da|en-gb|en|\*))(?!.*\1)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)* hier da, , en sind nur einige Beispiele. Sie wissen, jeder Sprache kann ein Wert q zugewiesen werden, um ihre Priorität darzustellen. Und ich hoffe nicht, dass wiederholte Sprachtypen vorkommen. Das ist was ich will.

+0

@anubhava Ich glaube nicht, dass diese Frage mit der verwendeten Sprache zu tun hat. Ich entwerfe nur eine Regex für die Darstellung der verschiedenen Sprachtypen. Tatsächlich ist der Fall, dass ich eine Reihe von Sprachtypen habe, und ich möchte sie mit Regex ohne wiederholte darstellen. –

+0

Versuchen Sie ['(?: (Da | en-gb | en | \ *)) (?!. * \ 1 (?! -))'] (https://regex101.com/r/mN6qR7/1) . –

+0

@ WiktorStribiżew Es funktioniert nicht. Hast du das versucht? –

Antwort

1

Sie eine (?!-) negative Vorschau nach den Rückreferenzierungen die Spiele beschränken können keinen Bindestrich haben direkt nach dem duplizierten Sprache Name:

(?:(da|en-gb|en|\*))(?!.*\1(?!-))(?:;q=(?:1|0(\.\d+)?))?(?:,(da|en-gb|en|\*)(?!.*\3(?!-))(?:;q=(?:1|0(?:\.\d+)?))?)* 
        ^^^^^^^^^^^^^           ^^^^^^^^^^^^^ 

Siehe regex demo

Wenn es eine - gibt, wird dieser Teilstring nicht gefunden.

0

Ein Update, das ich denken kann, ist die en-en-us als andere Sprache Typänderung ist en-gb die britische Englisch ist, sollte vorherige amerikanisches Englisch sein.

Wenn Sie damit einverstanden sind, könnte dies wie folgt funktionieren.

Regex:(en-gb|en-us|da)(?!\1)(en-gb|en-us|da)

Regex101 Demo

+0

Danke, aber gibt es eine Lösung, wenn ich nicht 'en' zu' en-us' ändere. Eine andere Sache, die ich fragen möchte ist, dass ich bemerkt habe, dass du '(?! \ 1)' während ich benutze '(?!.* \ 1) 'für nicht wiederholen. Würde mir bitte den Unterschied zwischen ihnen sagen? Vielen Dank –

+0

Wenn Sie '. *' Verwenden, bedeutet das, dass zwischen "übereinstimmender" und "wiederholter" Zeichenfolge "null" oder "viele" Zeichen stehen können. Ich hoffe du möchtest sukzessive wiederholte Saiten aufeinander abstimmen. In diesem Fall sollten die übereinstimmende Zeichenfolge und die folgende Zeichenfolge ohne irgendein Zeichen zwischen ihnen fortlaufend sein. –

+0

Wenn Sie 'en' nicht in' en-us' ändern, dann wird die Übereinstimmung 'en' die Teilzeichenfolge' en-gb' berücksichtigen, da es sich um eine Wiederholung handelt. –