我有以下html文件:
<!-- <div class="_5ay5"><table class="uiGrid _51mz" cellspacing="0" cellpadding="0"><tbody><tr class="_51mx"><td class="_51m-"><div class="_u3y"><div class="_5asl"><a class="_47hq _5asm" href="/Dev/videos/1610110089242029/" aria-label="Who said it?" ajaxify="/Dev/videos/1610110089242029/" rel="theater">
为了提取videos/
和/"
之间的数字字符串,我使用了我发现的以下方法:
我曾尝试在google上搜索一个解释(.*?)
在这个特定实现中是如何工作的,但是我仍然不清楚。有人能给我解释一下吗?这就是所谓的“非贪婪”匹配吗?如果是,那是什么意思?在
.
表示任何字符。*
表示任何次数,包括零。?
确实意味着非贪婪;这意味着它将尝试捕捉尽可能少的字符,也就是说,如果正则表达式遇到/
,它可以将其与.
匹配,但它不愿意这样做,因为.
是非贪婪的,并且由于regex中的下一个字符很乐意匹配/
,.
不需要。如果没有?
,那么{可以用一种简单的方式来解释:
.
:匹配任何内容(任何字符)*
:任意次数(至少零次)?
:尽可能少的次数(因此非贪婪)。在作为正则表达式匹配(例如)
^{pr2}$第一个捕获组返回
1610110089242029
,因为任何数字都是“any character”的一部分,并且其中至少有零个字符。在?
导致如下情况:正确匹配为},而不是
1610110089242029
和{1610110089242029/" something else … "videos/2387423470237509
,因此“尽可能少地匹配”,因此“非贪婪”。在本文中的})上的一个特殊运算符。在可用的引擎中,这会导致重复出现懒惰或非贪婪或不情愿或其他类似术语。典型的重复是贪婪的,这意味着它应该尽可能匹配。因此,在大多数现代perl兼容引擎中有三种类型的重复:
?
是重复运算符(+
,*
,和{更多信息可以在这里找到:http://www.regular-expressions.info/repeat.html#lazy表示不情愿/懒惰,这里:http://www.regular-expressions.info/possessive.html表示所有格(在这个答案中我将跳过讨论)。在
假设我们有字符串
aaaa
。我们可以用/(a+)a/
匹配所有的a。实际上这是这将匹配
aaaa
。regex是贪婪的,它将匹配尽可能多的a
。第一个子匹配是aaa
。在如果我们使用regex
/(a+?)a
这是我们只需要匹配。所以在本例中,匹配是
aa
,第一个子匹配是a
。我们只需要匹配一个a
来满足重复,然后它后面跟着一个a
。在当使用regex在html标记、引号等通常为快速和脏操作保留的类似方法中进行匹配时,会出现很多问题。也就是说,使用regex从非常大和复杂的html字符串或带转义序列的引号字符串中提取可能会导致很多问题,但对于特定的用例来说,这是非常合适的。因此,在您的案例中,我们有:
^{pr2}$表达式需要匹配
videos/
,后跟零个或多个字符,后跟/"
。如果只有一个视频网址在那里,这是很好的,而不是不情愿。在但是我们有
毫无疑问,正则表达式将匹配:
^{4}$它尽可能多地匹配,}满足
/
和{.
就可以了。由于不情愿,匹配会在第一个/"
处停止(实际上它是回溯的,但您可以单独阅读)。因此,您只得到您需要的部分url。在相关问题 更多 >
编程相关推荐