মিজোজার ধারণাটি অনুসরণ করে এবং জেসনস দ্বারা প্রকাশিত সমস্যাগুলি থেকে আঁকতে, আমার এই ধারণাটি ছিল; আমি কিছুটা পরীক্ষা করে দেখেছি তবে নিজের সম্পর্কে নিশ্চিত নই, তাই জেএস রেজেক্সে আমার চেয়ে আরও বিশেষজ্ঞের দ্বারা যাচাইকরণ দুর্দান্ত হবে :)
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
।
এখানে আমরা স্ট্রিংটি পরিবর্তন করি যাতে প্রদত্ত অবস্থানগুলি অফসেট করার জন্য আমাদের দৈর্ঘ্যের পার্থক্যের একটি ট্রেস রাখার প্রয়োজন ছিল replace
, সমস্ত গণনা করা হয়েছে str
, যা নিজে কখনও পরিবর্তন হয় না।
যেহেতু আদিম স্ট্রিংগুলি অপরিবর্তনীয়, আমরা str
পুরো ক্রিয়াকলাপের ফলাফল সংরক্ষণের জন্য ভেরিয়েবলটি ব্যবহার করতে পারতাম , তবে আমি ভেবেছিলাম যে উদাহরণটি, ইতিমধ্যে replacings দ্বারা জটিল, অন্য পরিবর্তনশীল ( str_done
) দিয়ে আরও পরিষ্কার হবে ।
আমি অনুমান করি যে পারফরম্যান্সের ক্ষেত্রে এটি অবশ্যই কঠোর হতে হবে: '' এর 'সমস্ত সময় অর্থহীন প্রতিস্থাপন, this str.length-1
সময়, এবং এখানে ডিয়ার দ্বারা ম্যানুয়াল প্রতিস্থাপন, যার অর্থ অনেকগুলি স্লাইসিং ... সম্ভবত এই নির্দিষ্ট উপরের ক্ষেত্রে সম্ভবত যেখানে আমরা sertোকাতে [match]
এবং .join()
এটি [match]
নিজেই যুক্ত করতে চাই কেবল তার চারপাশে কেবল একবার টুকরো টুকরো টুকরো করে কেটে গোষ্ঠীভূত করুন ।
অন্যটি বিষয় হ'ল আমি জানি না এটি কীভাবে আরও জটিল কেসগুলি পরিচালনা করবে, তা হ'ল জাল চেহারাটির পিছনে জটিল মানগুলি ... দৈর্ঘ্য সম্ভবত সবচেয়ে সমস্যাযুক্ত ডেটা পাওয়া।
এবং, checker
পিছনে non এর জন্য অযাচিত মানগুলির একাধিক সম্ভাবনার ক্ষেত্রে, আমাদের checker
একই রেজেক্স অবজেক্টটি তৈরি হওয়ার জন্য এড়িয়ে যাওয়ার জন্য আরও একটি রেইজেক্স (বাইরে ক্যাশে (তৈরি করা) করা ভাল, এর সাথে এটি পরীক্ষা করতে হবে'll প্রতিটি কল এ checker
) আমরা যা এড়াতে চাই তা এটি কিনা তা জানতে।
আশা করি আমি পরিষ্কার হয়েছি; যদি দ্বিধা না হয়, আমি আরও ভাল চেষ্টা করব। :)