Для небольшого арт-проекта мне нужно прочитать цены на акции из Yahoo финансирования. Источник html довольно сложный и длинный, но с помощью онлайн-тестировщика регулярных выражений я нашел регулярное выражение, которое должно привести к правильному выводу.
<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart\(10px\) Fz\(24px\)(\"| C\(\$dataGreen\)\"| C\(\$dataRed\)\") data-reactid\=\"35\">([-+]{0,1}\d*\.\d*) \((([-+]{0,1})\d*\.\d*)\%\)<\/span>
Вот небольшой фрагмент кода с результатом вложено в него:
<svg class="D(n) Cur(p)" width="24" style="fill:#000;stroke:#000;stroke-width:0;vertical-align:bottom;" height="24" viewBox="0 0 24 24" data-icon="search" data-reactid="29"><path d="M9 3C5.686 3 3 5.686 3 9c0 3.313 2.686 6 6 6s6-2.687 6-6c0-3.314-2.686-6-6-6m13.713 19.713c-.387.388-1.016.388-1.404 0l-7.404-7.404C12.55 16.364 10.85 17 9 17c-4.418 0-8-3.582-8-8 0-4.42 3.582-8 8-8s8 3.58 8 8c0 1.85-.634 3.55-1.69 4.905l7.403 7.404c.39.386.39 1.015 0 1.403" data-reactid="30"></path></svg></div></div></div><div class="My(6px) Pos(r) smartphone_Mt(6px)" data-reactid="31"><div class="D(ib) Va(m) Maw(65%) Ov(h)" data-reactid="32"><div class="D(ib) Mend(20px)" data-reactid="33"><span class="Trsdu(0.3s) Fw(b) Fz(36px) Mb(-4px) D(ib)" data-reactid="34">11,541.87</span><span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($dataRed)" data-reactid="35">-402.83 (-3.37%)</span><div id="quote-market-notice" class="C($tertiaryColor) D(b) Fz(12px) Fw(n) Mstart(0)--mobpsm Mt(6px)--mobpsm" data-reactid="36"><span data-reactid="37">At close: 5:44PM CET</span></div></div><!-- react-empty: 38 --></div></div></div></div></div><script>if (window.performance) {window.performance.mark && window.performance.mark('Lead-3-QuoteHeader');window.performance.measure && window.performance.measure('Lead-3-QuoteHeaderDone','PageStart','Lead-3-QuoteHeader');}</script></div><div data-reactid="29">
Моя проблема в том, что это регулярное выражение ведет себя иначе в онлайн-тестере, чем в egrep unter openwrt!
В онлайн-тестере это приводит к точно этот фрагмент:
<span class="Trsdu(0.3s) Fw(500) Pstart(10px) Fz(24px) C($dataGreen)" data-reactid="35">+50.32 (+0.17%)</span>
(с некоторыми дополнительными группами, отмеченными из-за дополнительных скобок в регулярном выражении)
Если я использую
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart\(10px\) Fz\(24px\)(\"| C\(\$dataGreen\)\"| C\(\$dataRed\)\") data-reactid\=\"35\">([-+]{0,1}\d*\.\d*) \((([-+]{0,1})\d*\.\d*)\%\)<\/span>' stock.html
, я получаю абсолютно нет результат. ОК, в регулярном выражении должна быть ошибка. Давайте начнем с малого:
egrep '<span class' stock.html
дает мне много результатов.
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\)' stock.html
все еще приводит к некоторым строкам кода. Но
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart' stock.html
ничего мне не дает! Niente! Нада! Даже
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) ' stock.html
(обратите внимание на пустое место в конце регулярного выражения!) Не дает мне результата. И я понятия не имею, в чем разница между
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\)' stock.html
и
egrep '<span class\=\"Trsdu\(0\.3s\) Fw\(500\) Pstart' stock.html
с точки зрения регулярных выражений! Если с пробелом будет проблема, я уже не получу результатов с первым пробелом перед "Fw". Так почему же мое регулярное выражение терпит неудачу с этим вторым пробелом?