Соответствие URL, только если он заканчивается определенным образом, игнорируя порядок - PullRequest
0 голосов
/ 17 февраля 2012

Мой контент состоит из текста и ссылок, где некоторые ссылки (только некоторые) могут заканчиваться шаблоном #PARAM1[\w+]#PARAM2[\w+]#PARAM3[\w+] - порядок не имеет значения, а PARAM2 и PARAM3 являются необязательными. Например, с учетом URL

http://www.google.com

Шаблон не должен совпадать, в то время как одно из следующего должно совпадать:

http://www.google.com#PARAM1[\w+]#PARAM2[\w+]#PARAM3[\w+]
http://www.google.com#PARAM1[\w+]
http://www.google.com#PARAM1[\w+]#PARAM2[\w+]
http://www.google.com#PARAM3[\w+]#PARAM2[\w+]#PARAM1[\w+]

И так далее. Для самого URL я использую следующее регулярное выражение, что достаточно для моих нужд:

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?

У меня вопрос, как я могу предоставить дополнительные параметры, которые будут включены в матч. Я пытался использовать позитивный взгляд:

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?((?=.*#ID\[\w+\])(?=.*#NAME\[\w+\])(?=.*#TAG\[\w+\]))

но совпадающая строка содержит только URL, поскольку заголовок не включен. Для этого должно быть простое решение! :)

Если это поможет, для этого я использую Java.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2012

Чувак, я парень из регулярных выражений, и я не стал бы пытаться расширить сопоставление URL. Разве вы не можете просто запустить свой специальный шаблон после первого запуска URL?

        string verifiedURL = @"http://www.google.com#PARAM3[\w+]#PARAM1[\w+]";
        //match (at least)1, or 2 or 3 occurrences of the PARAM sequence
        var pattern = @"(#PARAM\d\[\\w\+\])(#PARAM\d\[\\w\+\]){0,2}";
        var matches = Regex.Matches(verifiedURL , pattern);
0 голосов
/ 23 февраля 2012

Это может быть недостаточно строго для вас, и если ваши данные сильно отличаются от ваших примеров, это может не сработать, но я сделал удар и предложил следующее регулярное выражение. Это меньше на стороне фантазии и больше на стороне грубой силы.

\b(http|https):\/\/[\w\-_]+(\.[\w\-_]+)+(?:(\#PARAM(?:2|3)\[\\w\+])?(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+])?|(\#PARAM(?:2|3)\[\\w\+]){0,2}(\#PARAM1\[\\w\+])|(\#PARAM1\[\\w\+])(\#PARAM(?:2|3)\[\\w\+]){0,2})$

Я взял первую часть вашего регулярного выражения, а затем добавил регулярное выражение, которое соответствует трем вариантам, которые соответствуют возможным позициям требуемого параметра PARM1 по отношению к дополнительным параметрам:

  1. Дополнительный PARM2 / 3, Требуется PARM1, Дополнительный PARM2 / 3
  2. Дополнительный PARM2 / 3, Дополнительный PARM2 / 3, Требуемый PARM1
  3. Требуется PARM1, Опционально PARM2 / 3, Опционально PARM2 / 3

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

Как я уже говорил, он может быть недостаточно строгим, поскольку необязательные дополнительные параметры не требуют уникальности. Этот и подобные варианты пройдут:

http://www.google.com # PARAM1 [\ ш +] # Param3 [\ ш +] # Param3 [\ ш +]

Конечно, я не проводил исчерпывающих тестов, поэтому могут быть и другие ошибки, но, возможно, это поможет или даст вам что-то, на что можно опираться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...