我的内容包含文字和链接,其中一些链接(只有一些)可能以模式#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。
答案 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的可能位置:
替代方案有一些重叠;也许还有一些想法可能有点简化它们。
正如我所提到的,它对你来说可能不够严格,因为它不要求可选的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);