2016-04-05 8 views
1

正規表現のユニークな結果

例えば、enenen-gbenは一致部分がen-gbenであるとします。前者の2つが繰り返されているので、これが欲しいものです。en

は、しかし、私は、私は理由がenen-gbの部分文字列であるということだと思う、私は何を得るために何enenenen-gb一致部分がen-gbで、enen-gbあるを与えるとき。しかし、私はそれを修正する方法を知らない。誰か私に良いREを与えることができますか?多くのおかげで

===================更新が==============

質問の背景がありますaccept-languageのhttpヘッダーのRegexを設計したいと考えています。だから私はここで(?:(da|en-gb|en|\*))(?!.*\1)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)*を使用するdaen-gbenはちょうどいくつかのサンプルです。すべての言語に優先順位を表す値qを割り当てることができます。そして私はどんな繰り返しの言語タイプが起こることを望んでいない。これは私が欲しいものです。私は他の言語タイプとしてen-usenを変更していると考えることができます

+0

@anubhava私はあなたが使用する言語に関連するこの質問は考えません。私はちょうど異なる言語の種類を表すための正規表現を設計しています。実際には、私は言語の種類のセットを持っていると私はそれらを繰り返すことなく正規表現を使用して表現したいです。 –

+0

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

+0

@WiktorStribiżew動作しません。あなたはこれを試しましたか? –

答えて

1

あなたは右の重複言語名の後にハイフンを持たないために試合を制限するために後方参照の後(?!-)否定先読みを使用することができます。

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

regex demo

-がある場合、この部分文字列は一致しません。

0

一つの修正はイギリス英語であるen-gbで、以前のものは、アメリカ英語でなければなりません。

これで問題が解決しない場合は、次のように動作します。

正規表現:(en-gb|en-us|da)(?!\1)(en-gb|en-us|da)

Regex101 Demo

+0

ありがとうございます。しかし、私が 'en'を' en-us'に変更しなければ、解決策はありますか?私が尋ねたいもう一つは、 '(?!\ 1)'を使っている間に '(?!\ 1)'を使うことに気づいたということです。* \ 1) 'を繰り返します。彼らの違いを教えてください?多くのありがとう –

+0

'。*'を使用すると、一致する文字列と繰り返し文字列の間に 'zero'または' many'文字がある可能性があります。私はあなたが連続して繰り返される文字列にマッチしたいと思います。その場合、一致する文字列とそれに続く文字列は、それらの間に文字を入れずに連続していなければなりません。 –

+0

'en'を' en-us'に変更しないと 'en'は' en-gb'の部分文字列を繰り返しと見なし、 'en'を繰り返したものと見なします。 –

関連する問題