Недавно я узнал, что производительность в циклах 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