仅当URL以某种方式结束时才匹配URL,忽略该顺序

时间:2012-02-16 21:09:21

标签: java regex

我的内容包含文字和链接,其中一些链接(只有一些)可能以模式#PARAM1[\w+]#PARAM2[\w+]#PARAM3[\w+]结尾 - 顺序无关紧要,PARAM2和PARAM3是可选的。例如,给定网址

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 :(得分:0)

这对您来说可能不够严格,如果您的数据变化远远超出您的示例,它可能无法正常工作,但我采取了刺激并想出了以下正则表达式。它在花哨方面较少,在蛮力方面较多。

\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})$

我接受了正则表达式的第一部分,然后附加了一个正则表达式,该正则表达式匹配3个替代项,这些替代项对应于可选参数的所需PARM1的可能位置:

  1. 可选PARM2 / 3,必需PARM1,可选PARM2 / 3
  2. 可选PARM2 / 3,可选PARM2 / 3,必需PARM1
  3. 必需PARM1,可选PARM2 / 3,可选PARM2 / 3
  4. 替代方案有一些重叠;也许还有一些想法可能有点简化它们。

    正如我所提到的,它对你来说可能不够严格,因为它不要求可选的parms是唯一的。这个和类似的变化将通过:

    HTTP://www.google.com#PARAM1 [\ W +]#参数3 [\ W +]#参数3 [\ W +]

    当然,我没有详尽地测试,所以可能还有一些其他的错误,但也许这会有所帮助或给你一些建设的东西。

答案 1 :(得分:0)

伙计,我是一个正则表达式的人,我不会尝试扩展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);