Mijoja fikrini takip ederek ve JasonS'ın maruz kaldığı sorunlardan yola çıkarak bu fikrim vardı; Ben biraz kontrol ama kendim emin değilim, bu yüzden js regex benden daha uzman biri tarafından bir doğrulama harika olurdu :)
var re = /(?=(..|^.?)(ll))/g
// matches empty string position
// whenever this position is followed by
// a string of length equal or inferior (in case of "^")
// to "lookbehind" value
// + actual value we would want to match
, str = "Fall ball bill balll llama"
, str_done = str
, len_difference = 0
, doer = function (where_in_str, to_replace)
{
str_done = str_done.slice(0, where_in_str + len_difference)
+ "[match]"
+ str_done.slice(where_in_str + len_difference + to_replace.length)
len_difference = str_done.length - str.length
/* if str smaller:
len_difference will be positive
else will be negative
*/
} /* the actual function that would do whatever we want to do
with the matches;
this above is only an example from Jason's */
/* function input of .replace(),
only there to test the value of $behind
and if negative, call doer() with interesting parameters */
, checker = function ($match, $behind, $after, $where, $str)
{
if ($behind !== "ba")
doer
(
$where + $behind.length
, $after
/* one will choose the interesting arguments
to give to the doer, it's only an example */
)
return $match // empty string anyhow, but well
}
str.replace(re, checker)
console.log(str_done)
kişisel çıktım:
Fa[match] ball bi[match] bal[match] [match]ama
ilke, checker
herhangi bir iki karakterin arasındaki dizedeki her bir noktayı çağırmaktır , bu konum şu başlangıç noktası olduğunda:
--- (burada 'ba'
, bu nedenle ..
) istenmeyen boyutta herhangi bir alt dize (bu boyut biliniyorsa; aksi takdirde belki de yapmak daha zor olmalıdır)
--- --- veya dizenin başlangıcıysa bundan daha küçük: ^.?
ve bunu takiben,
--- gerçekte ne aranmalı (burada 'll'
).
Her çağrısında, checker
önceki değerin ll
istemediğimiz değer olup olmadığını kontrol etmek için bir test olacaktır ( !== 'ba'
); bu durumda, başka bir işlev çağırırız ve doer
str'deki değişiklikleri yapacak olan bu ( ) olması gerekir, amaç bu ise veya daha genel olarak, manuel olarak işlemek için gerekli verileri girer tarama sonuçları str
.
burada dizeyi değiştiriyoruz, bu nedenle replace
, hepsi hesaplanan ve str
hiçbir zaman değişmeyen, verilen konumları dengelemek için uzunluk farkının izini tutmamız gerekiyordu .
ilkel dizeler değişmez olduğundan, str
tüm işlemin sonucunu saklamak için değişkeni kullanmış olabiliriz , ancak değiştirmelerle zaten karmaşık olan örneğin başka bir değişkenle ( str_done
) daha açık olacağını düşündüm .
performans açısından oldukça sert olması gerektiğini tahmin ediyorum: '' içine '' tüm bu anlamsız yedekleri, this str.length-1
zamanlar, artı burada doer tarafından manuel değiştirme, bu da bir çok dilimleme anlamına gelir ... muhtemelen bu özel yukarıdaki durumda olabilir biz eklemek istediğiniz yere etrafında parçalar halinde sadece bir kez dize keserek, gruplanabilir [match]
ve .join()
onu ing [match]
kendisi.
diğer şey, daha karmaşık vakaları nasıl ele alacağını bilmiyorum, yani, sahte gözbebeği için karmaşık değerler ... uzunluk belki de elde etmek için en sorunlu veri olmak.
ve, checker
arkasında $ için istenmeyen değerlerin birden fazla olasılığı olması durumunda checker
, aynı regex nesnesinin oluşturulmasını önlemek için başka bir normal ifade (dışarıda önbelleğe alınacak (oluşturulacak) en iyisi ile bir test yapmamız gerekecek her çağrıda checker
) kaçınmaya çalıştığımız şey olup olmadığını bilmek.
umarım açık oldum; tereddüt etmeyin, ben daha iyi çalışacağım. :)