2016-04-05 4 views
1

У меня есть регулярное выражениеRegular Expression уникальный результат

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

То, что я хочу, чтобы получить это, чтобы соответствовать уникальным языком типа;

Например, enenen-gben номер матча en-gben, это то, что я хочу, потому что бывшие два en повторяются.

Однако, когда я даю enenenen-gb матч часть является en-gb, что я что получаю enen-gb, я думаю, что причина в том, что en подстрока en-gb. Но я не знаю, как это исправить. Может ли кто-нибудь дать мне лучше RE? Большое спасибо

=================== обновление ==============

Предыстория вопроса является что я хочу создать Regex для http-заголовка accept-language. Поэтому я использую (?:(da|en-gb|en|\*))(?!.*\1)(;q=(1|0(\.\d+)?))?(,(da|en-gb|en|\*)(;q=(1|0(\.\d+)?))?)* здесь da, en-gb, en - это всего лишь несколько образцов. Вы знаете, каждому языку может быть присвоено значение q для представления его приоритета. И я не надеюсь, что какой-либо повторяющийся тип языка произойдет. Это то, чего я хочу.

+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 на en-us, как и на другом языке, является en-gb который является британским английским, предыдущим должен быть американский английский.

Если вы в порядке, это может работать следующим образом.

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

Regex101 Demo

+0

Спасибо, но есть ли какое-либо решение, если я не изменю 'en' на' en-us'. Еще одна вещь, которую я хочу спросить, это то, что я заметил, что вы используете '(?! \ 1)', пока я использую '(?!.* \ 1) 'для повторения. Пожалуйста, скажите мне разницу между ними? Many Thanks –

+0

Когда вы используете '. *', Это означает, что между совпадающей и повторяющейся строкой могут быть символы «нуль» или «много». Надеюсь, вы хотите последовательно повторять строку. В этом случае согласованная строка и следующая строка должны быть последовательными без символа между ними. –

+0

Если вы не измените 'en' на' en-us', тогда совпадающий 'en' рассмотрит подстроку' en-gb' как повторение и рассмотрит ее как повторяющуюся 'en'. –