0

所以,我要承认,我从来没有真正研究过正则表达式。我要做的是捕获 Reddit URL 的 ID。URL 将被格式化为/r/AskReddit/comments/1234or/r/AskReddit/1234/或一些变体(缺少斜杠) - 它不应与dsada/...in匹配/r/AskReddit/comments/1234/dsada/...

这是我到目前为止所尝试的:

/r/.*/[comments/]?([a-z0-9])/?

虽然它匹配了一些奇怪的东西,

当尝试匹配/r/sdifsas/sdfad时,它实际上/r/sdifsas/sd会匹配,甚至会匹配/r/sdifsas/sdfad/aasdasd/a并且/r/sdifsas/comments/a/d

我知道我做错了什么,我觉得它与.*,我如何.*在仍然匹配所有内容的同时替换?另外,如何使正则表达式捕获多个(或上面某些随机匹配中的两个)结尾字母?

还有一件事,如果不是太麻烦,你能解释一下你使用的每一个东西是做什么的吗?我对此有点新手。

4

3 回答 3

1

首先,在您的正则表达式.*中匹配所有内容,直到字符串结束,然后开始回溯,直到成功。

其次,[...]对其中的任何字母进行匹配,?之后给出可选的含义。

因此,在您的 测试用例中/r/sdifsas/sd.*/匹配直到最后一个正斜杠,以下字母是s内部[...],最后d一个是范围内的一个a-z

在您的测试/r/sdifsas/sdfad/aasdasd/a中类似,.*/匹配直到最后一个正斜杠,该a字母没有 inside [...],所以跳过该部分并匹配a-z. 相同的行为/r/sdifsas/comments/a/d

我不知道您使用的是什么风格的正则表达式,但在黑暗中拍摄会是这样的:

/r/.*?/(?:comments/)?([a-z0-9]*)/? 

(?:...)它对路径的该部分使用非捕获组,并使用 a*来匹配字母和/或数字中的零个或多个。

于 2013-05-25T16:47:40.753 回答
1

描述

此正则表达式将通过要求 a/r/后跟 subreddit 的名称来验证字符串,然后它会移动并捕获 id,前提是它出现在 subreddit 名称之后或评论之后。通过m在搜索中使用选项并包括^匹配行首和$行尾,此正则表达式可用于包含任意数量的新行分隔的 reddit 链接的长文本字符串,如PHP 示例。

^\/r\/([a-z0-9]*)\/(?:Comments\/)?([a-z0-9]*)(?:\/?.*?)?$

在此处输入图像描述

团体

0 匹配整个字符串

  1. 捕获子 reddit 名称
  2. 捕获 id

PHP 代码示例:

你没有指定一种语言,所以我选择了 PHP 来展示这个正则表达式是如何工作的。

<?php
$sourcestring="/r/AskReddit/comments/1234
r/AskReddit/2345/
/r/AskReddit/comments/3456/dsada/
/r/IHeartKittens/comments/4567/dsada/
/r/cats/comments/i2sz9/we_rescued_a_kitten_last_month/
/r/IAmA/comments/18pik4/astronaut_chris_hadfield_comments/c8gud3h";
preg_match_all('/^\/r\/([a-z0-9]*)\/(?:Comments\/)?([a-z0-9]*)(?:\/?.*?)?$/im',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
 

$matches Array:
(
    [0] => Array
        (
            [0] => /r/AskReddit/comments/1234
            [1] => /r/AskReddit/2345/
            [2] => /r/AskReddit/comments/3456/dsada/
            [3] => /r/IHeartKittens/comments/4567/dsada/
            [4] => /r/cats/comments/i2sz9/we_rescued_a_kitten_last_month/
            [5] => /r/IAmA/comments/18pik4/astronaut_chris_hadfield_comments/c8gud3h
        )

    [1] => Array
        (
            [0] => AskReddit
            [1] => AskReddit
            [2] => AskReddit
            [3] => IHeartKittens
            [4] => cats
            [5] => IAmA
        )

    [2] => Array
        (
            [0] => 1234
            [1] => 2345
            [2] => 3456
            [3] => 4567
            [4] => i2sz9
            [5] => 18pik4
        )

)
于 2013-05-26T14:42:18.347 回答
0

尝试

/r/AskReddit/[comments/]?([a-z0-9])/?

反而。

您的解决方案存在 2 个缺陷:

  1. 您的.*部分匹配所有内容 - 特别是/构成您的网址的位置部分的字符
  2. 您正在贪婪地匹配,这是大多数正则表达式引擎 afaik 的默认设置。“贪婪”意味着在一场比赛中,子模式会吞噬尽可能多的字符。

1 和 2 合谋匹配比您想要的更大的部分 url。

于 2013-05-25T16:45:18.570 回答