正则表达式在测试人员中工作,但在Sublime Text 3中没有

时间:2018-02-07 22:23:13

标签: regex sublimetext3

在字符串

 <td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>

我正在尝试提取并复制到剪贴板

  

的Mozilla / 5.0   (Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML,与Gecko一样)   Chrome / 60.0.3112.113 Safari / 537.36

https://regexr.com/使用正则表达式测试程序,我发现这个正则表达式完成了我想要的:

(?<=<td class="useragent"><a href=".*">).*(?=</a>)

当我在Sublime Text中尝试它时,它没有。我猜这与RegEx的不同'风味'有关,那么如何更改此RegEx以使用Sublime Text?

2 个答案:

答案 0 :(得分:1)

Sublime Text 3 Regex Solution

你不能在PCRE正则表达式中使用未知长度的lookbehind(它是Sublime Text 3中使用的正则表达式库)。但是,由于您使用的是肯定的外观,因此您可以使用 \K匹配重置运算符(它将丢弃与匹配内存缓冲区匹配的所有文本)。

此外,您可能会考虑一些增强功能:

  • ".*"可能会在代码中溢出,请使用"[^"]*"代替
  • .*</a>可能会到达最后一行</a>,使用.*?</a>转到第一行
  • 如果<a>节点中有换行符,请使用(?s) DOTALL内联修饰符使.*?跨行匹配

使用

(?s)<td class="useragent"><a href="[^"]*">\K.*?(?=</a>)
                                          ^^ 

请参阅regex demo

ST3测试:

enter image description here

请参阅 regular-expressions.info 上的Keep The Text Matched So Far out of The Overall Regex Match

使用DOM解析的PHP回退

从解析任意HTML的数据时,您应该小心谨慎。如果您想从大HTML中获取所需的所有文本,则应考虑使用完整的HTML DOM支持技术。以下是使用PHP(see an online PHP demo)的示例:

$text = <<<EOD
<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>
EOD;
$domDocument = new DOMDocument;
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($domDocument);
$nodes = $xpath->query('//td[@class="useragent"]/a');
$res = [];
foreach($nodes as $txt) { 
   array_push($res, $txt->textContent);
}
print_r($res);

结果:

Array
(
    [0] => Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36
)

此处,$text是您的HTML文字,//td[@class="useragent"]/a是一个XPath,可获取td属性值等于class的所有useragent个节点,然后在其中抓取a个节点。实际文本随$txt->textContent一起返回。

答案 1 :(得分:0)

我在这里的所有内容都是Python,我针对你发布的字符串测试<td class="useragent"><a .*>(.*)</a></td>并且它有效。看

>>> import re
>>> agent=re.compile(r'<td class="useragent"><a .*>(.*)</a></td>')
>>> s='<td class="useragent"><a href="/useragents/parse/627832-chrome-windows-blink">Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36</a></td>'
>>> agent.findall(s)
['Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36']
>>> 

我希望有所帮助。