无法弄清楚这种不合理的正则表达式模式(甚至可能吗?)

时间:2014-06-06 10:52:43

标签: .net regex

我使用的是.NET正则表达式,所以从右向左是不可能的。

这是简化文字:

<a href=\"#\" rel=\"/my_sites/delete/3/470469\"><class=\"del-link\"></a>
<a target=\"_blank\" href=\"http://yoursite.com/abc" class=\"my_sites_url\"> http://yoursite.com/abc</a>

<a href=\"#\" rel=\"/my_sites/delete/1/2017354\"><class=\"del-link\"></a>
<a target=\"_blank\" href=\"https://www.abcdef.com" class=\"my_sites_url\"> http://abcdef.com</a>

<a href=\"#\" rel=\"/my_sites/delete/1/2012936\"><class=\"del-link\"></a>
<a target=\"_blank\" href=\"https://www.abc.com" class=\"my_sites_url\"> https://www.abc.com</a>

用户输入:www.abc.com,正则表达式输出应为:1/2012936 我试过这个:

(?s)(?<=my_sites/delete/).*?(?=\\.*www.abc.com)

但它似乎找到了所有三个值,而不仅仅是1/2012936(在http://regexhero.net/tester/中测试)

是否可以用一个正则表达式模式提取3/470469? (仅使用abc.com作为用户输入)

所以基本上我试图让正则表达式适用于用户提供的任何网址(因此每次只提取一个值)。我希望我已经清楚了。 (我当然可以将所有内容添加到列表中,但我想知道它是否可能出现一些不合适的模式或其他内容)。

提前谢谢! 问候, 琼斯

2 个答案:

答案 0 :(得分:1)

您想要的结果将始终是最后一个。因此,最简单的解决方案可能是保留您拥有的正则表达式,并在代码中提取最后一个匹配项。

一般情况下,除非你有充分的理由不这样做,否则最好将正则表达式的复杂性保留在合理的范围内

修改

在正则表达式中执行此操作的一种简单但不显眼的方式:

<a href=\\\"#\\\" rel=\\\"/my_sites/delete/(.*)\\\"><class=\\\"del-link\\\"></a>
<a target=\\\"_blank\\\" href=\\\"http://yoursite.com/abc" class=\\\"my_sites_url\\\"> http://yoursite.com/abc</a>

这匹配整个块中的一个。重要的是:(.*).*表示匹配任何字符,任意次,括号定义一个捕获组。当你想要匹配整个字符串时,这是正则表达式中的一个概念,但只有部分字符串是有意义的。就像在这种情况下,它只是你关心的那一部分,所以你在它周围放置了一个捕获组。无论您正在访问正则表达式的代码,几乎肯定会有一种方法来提取捕获组中匹配的内容。在此示例中,该组将捕获“1/2012936”

唯一需要注意的是额外的反斜杠,用于转义特殊的正则表达式字符

答案 1 :(得分:0)

如果必须使用正则表达式解析HTML,请尝试以下操作:

(?:/my_sites/delete/)(\d+/\d+).+\n.+?>\s*https?://(?:www.)?(?=abc.com)