मिजो के विचार के बाद, और जेसन द्वारा उजागर समस्याओं से ड्राइंग, मुझे यह विचार था; मैंने थोड़ी जाँच की लेकिन मुझे खुद पर यकीन नहीं है, इसलिए js regex में मेरे अलावा किसी और विशेषज्ञ द्वारा सत्यापन बहुत अच्छा होगा :)
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)
मेरा व्यक्तिगत आउटपुट:
Fa[match] ball bi[match] bal[match] [match]ama
सिद्धांत को बुलाना है checker
जब भी यह स्थिति आरंभिक बिंदु हो, किसी भी दो वर्णों के बीच स्ट्रिंग में प्रत्येक बिंदु पर :
--- जो नहीं चाहता है के आकार का कोई भी विकल्प (यहां 'ba'
, इस प्रकार)..
) (यदि वह आकार ज्ञात है, अन्यथा उसे करना कठिन होना चाहिए)
--- या उससे छोटा है अगर यह स्ट्रिंग की शुरुआत है: ^.?
और, इसके बाद,
--- वास्तव में क्या मांगा जाना है (यहां 'll'
)।
प्रत्येक कॉल पर checker
, यह जांचने के लिए एक परीक्षण होगा ll
कि क्या मूल्य पहले वह नहीं है जो हम नहीं चाहते ( !== 'ba'
); अगर ऐसा है, तो हम एक अन्य फ़ंक्शन को कॉल करते हैं, और इसे यह एक होना होगा ( doer
) जो str पर बदलाव करेगा, यदि उद्देश्य यह एक है, या अधिक उदारता से, जो इनपुट में आवश्यक डेटा को मैन्युअल रूप से प्रोसेस करने के लिए मिलेगा। के स्कैनिंग के परिणाम str
।
यहां हम स्ट्रिंग को बदलते हैं, इसलिए हमें दिए गए स्थानों को ऑफसेट करने के लिए लंबाई के अंतर का पता लगाने की आवश्यकता है , जो कि replace
सभी गणना करता है str
, जो खुद कभी नहीं बदलता है।
चूंकि आदिम तार अपरिवर्तनीय हैं, इसलिए हम str
पूरे ऑपरेशन के परिणाम को संग्रहीत करने के लिए चर का उपयोग कर सकते थे , लेकिन मुझे लगा कि उदाहरण, पहले से ही प्रतिकृति द्वारा जटिल, दूसरे चर ( str_done
) के साथ स्पष्ट होगा ।
मुझे लगता है कि प्रदर्शन के मामले में यह बहुत कठोर होना चाहिए: '' में '' के सभी निरर्थक प्रतिस्थापन, this str.length-1
समय, प्लस यहाँ कर्ता द्वारा मैनुअल प्रतिस्थापन, जिसका अर्थ है बहुत अधिक टुकड़ा करना ... शायद इस विशिष्ट उपरोक्त मामले में हो सकता है समूहीकृत किया जा सकता है, स्ट्रिंग को केवल एक बार टुकड़ों में काटकर, जहां हम इसे सम्मिलित करना चाहते हैं [match]
और .join()
इसे [match]
अपने साथ जोड़ सकते हैं।
दूसरी बात यह है कि मुझे नहीं पता कि यह और अधिक जटिल मामलों को कैसे निपटेगा, यानी फर्जी लुकहैब के लिए जटिल मूल्य ... लंबाई शायद सबसे अधिक समस्याग्रस्त डेटा प्राप्त करने के लिए।
और, checker
$ पीछे के गैर-वांछनीय मूल्यों की कई संभावनाओं के मामले में, हमें इसके साथ एक परीक्षण करना होगा, फिर भी एक और रेगेक्स (कैश्ड बनाया जाना) checker
सबसे अच्छा है, उसी रेगेक्स ऑब्जेक्ट से बचने के लिए। प्रत्येक कॉल पर checker
) यह जानने के लिए कि क्या हम बचने के लिए चाहते हैं या नहीं।
आशा है कि मैं स्पष्ट हो गया हूँ; अगर संकोच न करें, तो मैं बेहतर कोशिश करूँगा। :)