Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Regex问题-抓取YouTube_Java_Regex - Fatal编程技术网

Java Regex问题-抓取YouTube

Java Regex问题-抓取YouTube,java,regex,Java,Regex,我在抓取YouTube播放列表页面时遇到一些正则表达式代码问题。它基本上工作正常,但它得到了一些奇怪的结果 表达方式: (?<=v=)[a-zA-Z0-9-_]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+ 从这样的链接 https://www.youtube.com/watch?v=_ClmClS_Mqs&list=PL6422619E56951B73&index=5&feature=plpp

我在抓取YouTube播放列表页面时遇到一些正则表达式代码问题。它基本上工作正常,但它得到了一些奇怪的结果

表达方式:

(?<=v=)[a-zA-Z0-9-_]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+
从这样的链接

https://www.youtube.com/watch?v=_ClmClS_Mqs&list=PL6422619E56951B73&index=5&feature=plpp_video
在大多数情况下,这似乎工作正常,但它也在收集这些实例

data-thumb="//i1.ytimg.com/vi/84GVRtJ1CvY/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" ><span class="vertical-align"></span></span></span></span>

data-thumb="//i4.ytimg.com/vi/WNIPqafd4As/<FROM RIGHT ONWARDS IS WHAT IT MATCHES>default.jpg" alt="" class="thumb"></span></span></span><span class="clip"><span class="centering-offset"><span class="centering"><span class="ie7-vertical-align-hack">
data thumb=“//i1.ytimg.com/vi/84GVRtJ1CvY/default.jpg”>
data thumb=“//i4.ytimg.com/vi/WNIPqafd4As/default.jpg”alt=”“class=“thumb”>

正则表达式相当令人畏惧。有人知道表达式有什么问题吗?

作为建议,您要匹配的字符串总是11个字符长。与其尝试使用
+
量词匹配“尽可能多的字符”,不如使用
{11}
量词匹配“恰好11个字符”

这可能会解决您所看到的过度匹配问题的症状,尽管我不知道为什么它会首先匹配这些字符串。(它们不是以
v=
开头)

您可能应该通过插入以下括号来澄清您的备选方案:

((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+)
然后,您可以请求GET属性
v
。不需要正则表达式


这是特定于python的,但是Java将有等价物。关键是,regex并不总是最好的工具(只是最通用的工具)。

建议您要匹配的字符串长度始终为11个字符。与其尝试使用
+
量词匹配“尽可能多的字符”,不如使用
{11}
量词匹配“恰好11个字符”

这可能会解决您所看到的过度匹配问题的症状,尽管我不知道为什么它会首先匹配这些字符串。(它们不是以
v=
开头)

您可能应该通过插入以下括号来澄清您的备选方案:

((?<=v=)[a-zA-Z0-9-_]+(?=&))|((?<=[0-9]/)[^&\n]+)|((?<=v=)[^&\n]+)
然后,您可以请求GET属性
v
。不需要正则表达式


这是特定于python的,但是Java将有等价物。关键是,regex并不总是最好的工具(只是最通用的工具。)

您是否考虑过使用一些HTML解析器来构建元素树,然后只将正则表达式应用于该树中的链接?这是一个关于用正则表达式解析HTML而不是专用解析器的幽默观点。@Adam:我们不想解析任意HTML,只想解析URL。Cthulu/Tony the Pony不会因为试图用regex做这件事而消耗你的灵魂。(不过,仍然建议使用适当的HTML和URL解析库。)您是否考虑过使用一些HTML解析器来构建元素树,然后只将正则表达式应用于在该树中找到的链接?这是一个关于用正则表达式解析HTML而不是专用解析器的幽默观点。@Adam:我们不想解析任意HTML,只想解析URL。Cthulu/Tony the Pony不会因为试图用regex做这件事而消耗你的灵魂。(不过仍然建议使用适当的HTML和URL解析库。)+1是一个很好的答案,如果可以的话,我会添加另一个+1,因为“regex并不总是最好的工具(只是最通用的工具)”谢谢您的帮助。我计划在将来做更多的工作,但我几乎已经完成了整个项目,所以我将暂时留在regex。你的建议基本上解决了这个问题,但我认为现在问题正在好转。你知道为什么吗?有趣的答案是“你的正则表达式不够具体”。)更严重的是,你的正则表达式实际上是三个正则表达式合一——你能试着把它们分开,看看三个子正则表达式中哪一个产生了错误的匹配吗?(通过分治进行调试。)+1是一个很好的答案,如果可以的话,我会再加一个+1,因为“regex并不总是最好的工具(只是最通用的工具)”谢谢你的帮助。我计划在将来做更多的工作,但我几乎已经完成了整个项目,所以我将暂时留在regex。你的建议基本上解决了这个问题,但我认为现在问题正在好转。你知道为什么吗?有趣的答案是“你的正则表达式不够具体”。)更严重的是,你的正则表达式实际上是三个正则表达式合一——你能试着把它们分开,看看三个子正则表达式中哪一个产生了错误的匹配吗?(通过分治进行调试。)
{
'v' : '_ClmClS_Mqs',
'list' : 'PL6422619E56951B73',
'index' : '5'
'feature' : 'plpp_video',
}