Регулярное выражение для сопоставления имен переменных Javascript с точками - PullRequest
0 голосов
/ 30 октября 2018

Недавно я узнал, что производительность в циклах for можно значительно повысить, переместив length / count за пределы цикла, и подумал, что я посмотрю, как реализовать это на моем сайте.

Выполнение полного поиска по регулярному выражению с использованием for\(.*<.*\.length показало, что у меня было около 600 совпадений по 70 из 12 000 найденных файлов, и по мере того, как я проходил, я понял, что просто вырезал и вставлял снова и снова с небольшими вариациями, где я мог бы просто скопируйте исходный код, который рассчитал длину, удалите точки и используйте первый символ с заглавной буквы.

Например: for(c=a.children.length-1;0<=c;c--)d станет

var AChildrenLength=a.children.length;
for(c=AChildrenLength-1;0<=c;c--)d

Как только я понял, что то, что я делал, было монотонным, пришло время повеселиться с регулярными выражениями, которые можно превратить в сценарий оболочки, который может изменять обычные или свернутые файлы.

Казалось, достаточно просто, чтобы начать, но потом у меня возникли проблемы с некоторыми совпадениями, разделенными точками. Вот несколько примеров, с которыми мне сложно совместить:

for($j = 0; $j < incomingData.customer['data'].length; $j++){

for(c=a.children.length-1;0<=c;c--)d

for(l=0;l<g.length;l++){d=g[l]

// this is a fun one to look at, I didn't know you could do a for loop like that.
for(h in b)if(!h.match(d||/margin|text\-align|width|border|padding/i))if(g)g=!1;else{var l=new CKEDITOR.htmlParser.element("span");l.attributes.style=h+":"+b[h];c.add(l);c=l;delete b[h]}CKEDITOR.tools.isEmpty(b)?delete a.attributes.style:a.attributes.style=CKEDITOR.tools.writeCssText(b);for(b=0;b<e.length;b++)c.add(e[b])},sortStyles:function(a){for(var b=["border","border-bottom","font-size","background"],c=m.parseCssText(a.attributes.style),d=m.objectKeys(c),e=[],g=[],h=0;h<d.length;h++)

for(var f=0,n=0,l=0,p,e=a.$.rows.length;l<e;l++)

for(var i = 0; i < this.audioLayerControl.listOfSequenceEditors.length; ++i)

Я использую это регулярное выражение: (?:for\(.*<\W?)(([\w]+)\.?)+(?:\[?)|(?:\.length)

Вы можете увидеть, что соответствует цветовой кодировке здесь: https://regex101.com/r/GsPieq/2

По какой-то причине оно соответствует только последнему слову в каждом. Может кто-нибудь помочь мне понять, почему это не работает? Мне нужно, чтобы оно совпадало между 1 и, вероятно, 5 словами, разделенными точками, не включая .length или что-либо в скобках, например {"data"], где я мог бы затем перебирать каждое совпадение, превращая первый символ в заглавную.

Он не должен совпадать с тем, что уже правильно сформировано, например, for(c=AChildrenLength-1;0<=c;c--)d

Вот мой мыслительный процесс:

(?:for\(.*<\W?) // Non capture but match any for loop up to the test
(
   ([\w]+)\.? // capture any alphanumeric char up to a dot if it exists
)+ // repeat if possible
(?:\[?)|(?:\.length)  // non capture find where it ends
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...