Оптимизируйте регулярные выражения с помощью токенов - PullRequest
0 голосов
/ 30 сентября 2019

Я использую это регулярное выражение, которое является функциональным, но я хотел бы оптимизировать его. Я нахожу это очень "буквальным", и поэтому я думаю, что это влияет на лечение с использованием токенов, оно должно быть быстрее, только это не очень очевидно для новичка ...

const pattern = /left\s:([-]{0,1}[0-9]{1,4})px;\stop:([0-9]{1,4})px;"\s\s\tonmouseover="updi\(event,'([0-9]{4}-[0-9]{2}-[0-9]{2})\s([0-9]{2}:[0-9]{2})\s([A-Z]{3,4})\s\((T[+]{1}\s[0-9]{1}:[0-9]{2}|T[+]{1}[0-9]{2,3}:[0-9]{2})\)<br>Distances:&nbsp;([0-9]{1,4}\.[0-9]{1}nm)\/([0-9]{1,4}\.[0-9]{1}nm)<br><b>Wind:<\/b>\s([0-9]{1,3}&deg);\s([0-9]{1,2}\.[0-9]{1}\skt)\s\(<b>TWA\s([-]{0,1}[0-9]{1,3}&deg);<\/b>\)<br><b>Heading:<\/b>\s([0-9]{1,3}&deg);<b>Sail:<\/b>\s([a-zA-Z]{2,4})<br><b>Boat\sSpeed:<\/b>\s([0-9]{1,3}\.[0-9]{2}\skts)/

Она извлекает значениякоторый я эксплуатирую позже и работает над этим видом кода:

<img src="img/dot.png" alt="" class="abs" style="z-index: 1; left :-4904px; top:2437px;" 
onmouseover="updi(event,'2019-10-15 02:00 CEST (T+ 1:50)<br>Distances:&nbsp;1271.8nm/447.1nm<br><b>Wind:</b> 295&deg; 5.8 kt (<b>TWA 65&deg;</b>)<br><b>Heading:</b> 230&deg;<b>Sail:</b> Jib<br><b>Boat Speed:</b> 3.23 kts','220px')" onmouseout="cleari()" 
onmousedown="show_wind(366);">
<img src="img/dot.png" alt="" class="abs" style="z-index: 1; left :49px; top:243px;" 
onmouseover="updi(event,'2019-10-15 02:00 CET (T+363:50)<br>Distances:&nbsp;1271.8nm/447.1nm<br><b>Wind:</b> 295&deg; 5.8 kt (<b>TWA 65&deg;</b>)<br><b>Heading:</b> 230&deg;<b>Sail:</b> Jib<br><b>Boat Speed:</b> 3.23 kts','220px')" onmouseout="cleari()" 
onmousedown="show_wind(366);">

1 Ответ

0 голосов
/ 30 сентября 2019

Это НАМНОГО лучше решается с помощью парсера HTML. Если у вас есть хоть какая-то разница в вашем регулярном выражении в HTML, все сломается. HTML с Regex - плохая идея.

... Но если вы хотите оптимизировать свое регулярное выражение, это можно сделать.

  • [0-9] можетможно заменить на \d
  • [a-zA-Z_] можно заменить на \w
  • [-]{0,1} можно заменить на -?
  • T[+]{1} можно заменитьс T\+
  • Незначительный текст часто можно пропустить с помощью .*, ЕСЛИ у вас есть четко определенный шаблон после него

Вот рабочая, сокращенная версия вашего регулярного выражения. Не уверен, что это "быстрее" или нет, так как тот, который вы опубликовали, не работает. Позвольте мне еще раз повторить, что я настоятельно рекомендую вместо этого использовать анализатор HTML.

left :(-?\d{1,4})px; top:(-?\d{1,4})px;"\s*onmouseover="updi\(event,'(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}) (\w{3,4}) \((T\+ ?\d{1,3}:\d{2})\)<br>Distances:&nbsp;(\d{1,4}\.\dnm)\/(\d{1,4}\.\dnm)<br><b>Wind:<\/b> (\d{1,3}&deg); (\d{1,2}\.\d kt) \(<b>TWA (-?\d{1,3}&deg);<\/b>\)<br><b>Heading:<\/b> (\d{1,3}&deg);<b>Sail:<\/b> (\w{2,4})<br><b>Boat Speed:<\/b> (\d{1,3}\.\d{2} kts)

Попробуйте здесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...