জাভাস্ক্রিপ্ট: সমতুল্য নেতিবাচক চেহারা?


141

জাভাস্ক্রিপ্ট নিয়মিত প্রকাশে negativeণাত্মক লুকের পিছনের সমতুল্য অর্জনের কি কোনও উপায় আছে ? আমাকে এমন একটি স্ট্রিং মিলাতে হবে যা নির্দিষ্ট অক্ষরের সেট দিয়ে শুরু হয় না।

দেখে মনে হচ্ছে আমি স্ট্রিংয়ের শুরুতে মিলে যাওয়া অংশটি পাওয়া গেলে ব্যর্থ না হয়ে এটি করে এমন একটি রেজেক্স খুঁজে পেতে অক্ষম। নেতিবাচক চেহারাটির পিছনে একমাত্র উত্তর বলে মনে হচ্ছে তবে জাভাস্ক্রিপ্টটির কোনও উত্তর নেই।

সম্পাদনা: এটি আমি কাজ করতে চাই এমন রেজিটেক্স, তবে এটি হয় না:

(?<!([abcdefg]))m

সুতরাং এটি 'জিম' বা 'এম' এর 'মি' এর সাথে মিলবে তবে 'জ্যাম' নয়


রেজেক্স পোস্ট করার বিষয়টি বিবেচনা করুন যেমন এটি একটি নেতিবাচক বর্ণনার পিছনে প্রদর্শিত হবে; এটি প্রতিক্রিয়া জানাতে আরও সহজ করে তুলতে পারে।
ড্যানিয়েল লেচেমিন্যান্ট

1
যারা গ্রহণের চেহারা ইত্যাদি অনুসরণ করতে চান তারা দয়া করে ECMAScript 2016+ সামঞ্জস্যতার টেবিলটি পড়ুন
উইক্টর স্ট্রিবিউউ

@ উইক্টরস্ট্রিবিউইউউ: লুকে পিছনে যুক্ত করা হয়েছে 2018 টি অনুমানে। ক্রোম তাদের সমর্থন করে, তবে ফায়ারফক্স এখনও সেই পরিকল্পনাটি কার্যকর করেনি
লনি সেরা

এই এমনকি পিছনে এক নজর প্রয়োজন? কি হবে (?:[^abcdefg]|^)(m)? যেমনটি রয়েছে"mango".match(/(?:[^abcdefg]|^)(m)/)[1]
শে

উত্তর:


57

Lookbehind গবেষকেরা পেয়েছিলাম গৃহীত মধ্যে নাম ECMAScript স্পেসিফিকেশন 2018 সালে।

ব্যবহারের পিছনে ইতিবাচক চেহারা:

console.log(
  "$9.99  €8.47".match(/(?<=\$)\d+(\.\d*)?/) // Matches "9.99"
);

নেতিবাচক চেহারা পিছনে ব্যবহার:

console.log(
  "$9.99  €8.47".match(/(?<!\$)\d+(?:\.\d*)/) // Matches "8.47"
);

প্ল্যাটফর্ম সমর্থন:


2
কোন পলিফিল আছে?
কিলি

1
@ কিলি যতটা আমি জানি ততটা পাওয়া যায় নি, এবং আমার সন্দেহ আছে যে সেখানে কখনও উপস্থিত হবে, কারণ এটি তৈরি করা সম্ভাব্যভাবে
অবৈধ

একটি ব্যাবেল প্লাগইন ব্যবহার সম্পর্কে কী, এটি কি ES5 এ সংকলন করা বা ইতিমধ্যে সমর্থিত ES6 সম্ভব?
স্টিফান জে

1
@ ইল্পো ওকসেনেন আমি মনে করি আপনার রেজিএক্স বাস্তবায়ন বাড়ানো মানে ... যা পলিফিলসই করছে .... এবং জাভাস্ক্রিপ্টে যুক্তি লেখার ক্ষেত্রে কোনও ভুল নেই
নিউউউজিক

1
আপনি কি বিষয়ে কথা হয়? প্রায় সমস্ত প্রস্তাবগুলি অন্য ভাষার দ্বারা অনুপ্রাণিত হয় এবং তারা সর্বদা অন্যান্য ভাষার বাক্য গঠন এবং শব্দার্থতত্ত্বের সাথে মিল রাখতে পছন্দ করবে যেখানে এটি আইডোমেটিক জেএস এবং পিছনের সামঞ্জস্যের প্রসঙ্গে উপলব্ধি করে। আমি মনে করি যে আমি বেশ স্পষ্টভাবে বলেছি যে 2017 সালে অনুমান এবং নেতিবাচক চেহারা উভয়ই গ্রহণ করা হয়েছিল এবং আমি উত্সগুলিতে লিঙ্ক দিয়েছি। তদুপরি, আমি প্ল্যাটফর্মগুলি কীভাবে স্পেসিফিকেশন প্রয়োগ করেছে এবং অন্যান্য প্ল্যাটফর্মগুলির স্থিতি কী তা কার্যকরভাবে বর্ণনা করেছি - এবং তখন থেকেই এটি আপডেট করে চলেছি। স্বাভাবিকভাবেই এটি আমরা দেখতে পাবে না এমন শেষ রেজিএক্সএক্স বৈশিষ্ট্য
ওক্কু

83

2018 সাল থেকে, লুকবিহাইড এ্যাসারেন্সগুলি ECMAScript ভাষার স্পেসিফিকেশনের অংশ ।

// positive lookbehind
(?<=...)
// negative lookbehind
(?<!...)

উত্তর প্রাক 2018

জাভাস্ক্রিপ্ট যেমন নেতিবাচক বর্ণনাকে সমর্থন করে , তাই করার একটি উপায় হ'ল:

  1. ইনপুট স্ট্রিং বিপরীত

  2. একটি বিপরীত রেজেক্সের সাথে মেলে match

  3. বিপরীত এবং ম্যাচগুলি পুনরায় ফর্ম্যাট করুন


const reverse = s => s.split('').reverse().join('');

const test = (stringToTests, reversedRegexp) => stringToTests
  .map(reverse)
  .forEach((s,i) => {
    const match = reversedRegexp.test(s);
    console.log(stringToTests[i], match, 'token:', match ? reverse(reversedRegexp.exec(s)[0]) : 'Ø');
  });

উদাহরণ 1:

অ্যান্ড্রু-এনসলির প্রশ্ন অনুসরণ করছেন:

test(['jim', 'm', 'jam'], /m(?!([abcdefg]))/)

আউটপুট:

jim true token: m
m true token: m
jam false token: Ø

উদাহরণ 2:

@ নিউউউজিক মন্তব্য অনুসরণ করে (ম্যাচ max-heightকিন্তু নয় line-height, টোকেন সত্তা height):

test(['max-height', 'line-height'], /thgieh(?!(-enil))/)

আউটপুট:

max-height true token: height
line-height false token: Ø

36
এই পদ্ধতির সাথে সমস্যাটি হ'ল যখন আপনি উভয় দিকে তাকিয়ে থাকবেন তখন এটি কাজ করে না
kboom

3
আপনি কি দয়া করে একটি কাজের উদাহরণ দেখিয়ে বলতে পারেন যে আমি ম্যাচ করতে চাই max-heightকিন্তু তা নয় line-heightএবং আমি কেবল height
ম্যাচটিই

টাস্কটি দুটি চিহ্নের আগে না থাকা টানা দুটি অভিন্ন চিহ্ন (এবং 2 টির বেশি নয়) প্রতিস্থাপন করা যদি এটি সাহায্য করে না। অন্য প্রান্ত থেকে ''(?!\()এস্ট্রোফেসগুলি প্রতিস্থাপন করবে ''(''test'''''''test, এভাবে (''test'NNNtestপরিবর্তে ছেড়ে যাবে (''testNNN'test
উইক্টর স্ট্রিবিউউ

61

আসুন আপনি সব খুঁজতে চান অনুমান intপূর্বে না unsigned:

নেতিবাচক চেহারা পিছনে জন্য সমর্থন সহ:

(?<!unsigned )int

নেতিবাচক চেহারা পিছনে জন্য সমর্থন ছাড়া:

((?!unsigned ).{9}|^.{0,8})int

মূলত ধারণাটি হ'ল n পূর্ববর্তী অক্ষরগুলি ধরে নেওয়া এবং নেতিবাচক চেহারা-এর সাথে ম্যাচটি বাদ দেওয়া, তবে এমন কোনও ক্ষেত্রে যেখানে পূর্বের এন অক্ষর নেই সেগুলিও মেলে। (যেখানে এন চেহারা-পিছনের দৈর্ঘ্য)।

সুতরাং প্রশ্নে রেজেক্স:

(?<!([abcdefg]))m

অনুবাদ করতে হবে:

((?!([abcdefg])).|^)m

আপনার পছন্দসই স্ট্রিংয়ের সঠিক স্পট বা আপনার নির্দিষ্ট অংশটি অন্য কোনও কিছুর সাথে প্রতিস্থাপন করতে চান তার সঠিক স্থান খুঁজতে আপনাকে ক্যাপচারিং গ্রুপগুলির সাথে খেলতে হবে।


2
এটি সঠিক উত্তর হওয়া উচিত। দেখুন: "So it would match the 'm' in 'jim' or 'm', but not 'jam'".replace(/(j(?!([abcdefg])).|^)m/g, "$1[MATCH]") রিটার্নগুলি "So it would match the 'm' in 'ji[MATCH]' or 'm', but not 'jam'" এটি বেশ সহজ এবং এটি কাজ করে!
আসরাইল

41

মিজোজার কৌশল আপনার নির্দিষ্ট ক্ষেত্রে কাজ করে তবে সাধারণভাবে নয়:

js>newString = "Fall ball bill balll llama".replace(/(ba)?ll/g,
   function($0,$1){ return $1?$0:"[match]";});
Fa[match] ball bi[match] balll [match]ama

এখানে একটি উদাহরণ যেখানে লক্ষ্যটি ডাবল-এলের সাথে মেলে তবে এটি "বা" এর আগে না থাকলে নয়। "বল" শব্দটি নোট করুন - সত্য চেহারাটির পিছনে প্রথম 2 টি দমন করা উচিত ছিল তবে ২ য় জোড়ার সাথে মিলছে। তবে প্রথম 2 টি এর সাথে ম্যাচ করে এবং তারপরে সেই ম্যাচটিকে একটি মিথ্যা ধনাত্মক হিসাবে উপেক্ষা করে, রেজিএক্সএক্স ইঞ্জিন match ম্যাচের শেষ থেকে এগিয়ে যায় এবং মিথ্যা পজিটিভের মধ্যে থাকা কোনও অক্ষরকে উপেক্ষা করে।


5
আহ, আপনি ঠিক বলেছেন। তবে এটি আমার আগের চেয়ে অনেক কাছাকাছি। আরও ভাল কিছু না আসা পর্যন্ত আমি এটি গ্রহণ করতে পারি (জাভাস্ক্রিপ্ট আসলে চেহারাটির পিছনে বাস্তবায়ন করে)।
অ্যান্ড্রু এনসলে

33

ব্যবহার

newString = string.replace(/([abcdefg])?m/, function($0,$1){ return $1?$0:'m';});

10
এটি কিছুই করে না: newStringসর্বদা সমান হবে string। এত উপভোগ কেন?
মাইকম

@ মাইকএম: কারণ বিষয়টিটি কেবল একটি ম্যাচের কৌশলটি প্রদর্শন করা।
বাগ

57
@bug। এমন একটি বিক্ষোভ যা কিছু না করে সে এক অদ্ভুত প্রকারের প্রদর্শন। উত্তরটি এমনভাবে আসে যাতে এটি কীভাবে কাজ করে তার কোনও ধারণা ছাড়াই এটি কেবল অনুলিপি এবং আটকানো হয়েছিল। সুতরাং সহিত ব্যাখ্যার অভাব এবং তা প্রমাণ করতে ব্যর্থতা যে কোনও কিছু মিলেছে।
মাইকএম

2
@ মাইকএম: এসও এর নিয়ম হল, যদি প্রশ্নটি লিখিতভাবে উত্তর দেয় তবে এটি সঠিক। ওপি কোনও ব্যবহারের ক্ষেত্রে সুনির্দিষ্টভাবে উল্লেখ করে নি
বাগ ২

7
ধারণাটি সঠিক, তবে হ্যাঁ এটি খুব ভালভাবে ডেমো হয় নি। জাতীয় কনসোলে এই চলমান চেষ্টা করুন ... "Jim Jam Momm m".replace(/([abcdefg])?m/g, function($0, $1){ return $1 ? $0 : '[match]'; });। এটা ফিরে আসা উচিত Ji[match] Jam Mo[match][match] [match]। তবে আরও মনে রাখবেন যে জেসন নীচে উল্লিখিত হিসাবে এটি নির্দিষ্ট প্রান্তের ক্ষেত্রে ব্যর্থ হতে পারে।
সাইমন পূর্ব

11

আপনি নিজের চরিত্রের সেটটিকে উপেক্ষা করে একটি নন-ক্যাপচারিং গ্রুপকে সংজ্ঞায়িত করতে পারেন:

(?:[^a-g])m

... যা সেই অক্ষরের m কোনওটির আগে থাকা প্রতিটি মিলের সাথে মিলবে ।


2
আমি মনে করি ম্যাচটি আসলে পূর্বের চরিত্রটিও কভার করবে।
স্যাম

4
^ এটা সত্য। একটি চরিত্র শ্রেণি প্রতিনিধিত্ব করে ... একটি চরিত্র! আপনার সমস্ত ক্যাপচারকারী গোষ্ঠী যা করছে সেটি কোনও মান প্রতিস্থাপনের প্রসঙ্গে উপলব্ধ করছে না। আপনার অভিব্যক্তিটি " এই চিঠির
কোনওটির

5
মূল সমস্যাটিও সমাধান করার উত্তরের জন্য (স্ট্রিংয়ের শুরু), এটিতে অবশ্যই একটি বিকল্প অন্তর্ভুক্ত করা উচিত, ফলে ফলস্বরূপ রেজেক্সটি হবে (?:[^a-g]|^)m। চলমান উদাহরণের জন্য regex101.com/r/jL1iW6/2 দেখুন ।
জনি স্কোভডাল

অকার্যকর যুক্তি ব্যবহার করা সর্বদা পছন্দসই প্রভাব দেয় না।
গোল্ডবিশপ

2

আমি এভাবেই str.split(/(?<!^)@/)নোড.জেএস 8 এর জন্য অর্জন করেছি (যা চেহারাটির পিছনে সমর্থন করে না):

str.split('').reverse().join('').split(/@(?!$)/).map(s => s.split('').reverse().join('')).reverse()

কাজ করে? হ্যাঁ (ইউনিকোড অপরিশোধিত)। অপ্রীতিকর? হ্যাঁ.


1

মিজোজার ধারণাটি অনুসরণ করে এবং জেসনস দ্বারা প্রকাশিত সমস্যাগুলি থেকে আঁকতে, আমার এই ধারণাটি ছিল; আমি কিছুটা পরীক্ষা করে দেখেছি তবে নিজের সম্পর্কে নিশ্চিত নই, তাই জেএস রেজেক্সে আমার চেয়ে আরও বিশেষজ্ঞের দ্বারা যাচাইকরণ দুর্দান্ত হবে :)

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) আমরা যা এড়াতে চাই তা এটি কিনা তা জানতে।

আশা করি আমি পরিষ্কার হয়েছি; যদি দ্বিধা না হয়, আমি আরও ভাল চেষ্টা করব। :)


1

আপনার কেসটি ব্যবহার করে, আপনি যদি কোনও m কিছু দিয়ে প্রতিস্থাপন করতে চান , উদাহরণস্বরূপ এটিকে বড় হাতের কাছে রূপান্তর করুন M, আপনি গ্রুপ ক্যাপচারে সেটটিকে অস্বীকার করতে পারেন।

ম্যাচ ([^a-g])m, সঙ্গে প্রতিস্থাপন$1M

"jim jam".replace(/([^a-g])m/g, "$1M")
\\jiM jam

([^a-g])( ^) a-gপরিসরে নয় এমন কোনও চরিত্রের সাথে মেলে এবং এটি প্রথম ক্যাপচারিং গ্রুপে সঞ্চয় করবে, যাতে আপনি এটি দিয়ে অ্যাক্সেস করতে পারেন $1

সুতরাং আমরা এটি imসন্ধান jimএবং প্রতিস্থাপন iMযা ফলাফল ফলাফল jiM


1

পূর্বে উল্লিখিত হিসাবে, জাভাস্ক্রিপ্ট এখন চেহারাগুলির পিছনে অনুমতি দেয়। পুরানো ব্রাউজারগুলিতে আপনার এখনও একটি কর্মচক্র প্রয়োজন।

আমি আমার মাথায় বাজি ধরেছি যে চেহারাটির ঠিক পিছনে ফলাফলটি সরবরাহ করে না এমন রিজেক্স সন্ধান করার কোনও উপায় নেই। আপনি যা করতে পারেন তা গ্রুপগুলির সাথে কাজ করা। ধরা যাক আপনার একটি রেজেক্স আছে (?<!Before)Wanted, আপনি কোথায় Wantedরেগেক্স ম্যাচ করতে চান এবং Beforeসেই রেজেক্স যা ম্যাচের আগে কী হওয়া উচিত তা গণনা করে। আপনি সবচেয়ে ভাল যা করতে পারেন তা হ'ল রেজেক্সকে অস্বীকার করা এবং রেজেক্স Beforeব্যবহার করা NotBefore(Wanted)। পছন্দসই ফলাফল প্রথম গ্রুপ $1

আপনার ক্ষেত্রে Before=[abcdefg]যা প্রত্যাখ্যান করা সহজ NotBefore=[^abcdefg]। সুতরাং রেজেক্স হবে [^abcdefg](m)। আপনার যদি পজিশনের প্রয়োজন হয় তবে Wantedআপনার অবশ্যই গ্রুপ করা NotBeforeউচিত, যাতে কাঙ্ক্ষিত ফলাফলটি দ্বিতীয় গ্রুপ হয়।

যদি Beforeপ্যাটার্নের মিলগুলির একটি নির্দিষ্ট দৈর্ঘ্য nথাকে, তবে, যদি প্যাটার্নটিতে পুনরাবৃত্তিযোগ্য টোকেন না থাকে তবে আপনি Beforeপ্যাটার্নটিকে উপেক্ষা করতে এবং নিয়মিত প্রকাশটি ব্যবহার করতে পারেন (?!Before).{n}(Wanted), তবে এখনও প্রথম গ্রুপটি ব্যবহার করতে হবে বা নিয়মিত এক্সপ্রেশন (?!Before)(.{n})(Wanted)ব্যবহার করতে হবে এবং দ্বিতীয়টি ব্যবহার করতে হবে গ্রুপ। এই উদাহরণে, প্যাটার্নটির Beforeপ্রকৃতপক্ষে একটি নির্দিষ্ট দৈর্ঘ্য রয়েছে, যথা 1, সুতরাং রেজেক্স (?![abcdefg]).(m)বা ব্যবহার করুন (?![abcdefg])(.)(m)। আপনি যদি সমস্ত ম্যাচে আগ্রহী হন, gপতাকা যুক্ত করুন , আমার কোড স্নিপেট দেখুন:

function TestSORegEx() {
  var s = "Donald Trump doesn't like jam, but Homer Simpson does.";
  var reg = /(?![abcdefg])(.{1})(m)/gm;
  var out = "Matches and groups of the regex " + 
            "/(?![abcdefg])(.{1})(m)/gm in \ns = \"" + s + "\"";
  var match = reg.exec(s);
  while(match) {
    var start = match.index + match[1].length;
    out += "\nWhole match: " + match[0] + ", starts at: " + match.index
        +  ". Desired match: " + match[2] + ", starts at: " + start + ".";   
    match = reg.exec(s);
  }
  out += "\nResulting string after statement s.replace(reg, \"$1*$2*\")\n"
         + s.replace(reg, "$1*$2*");
  alert(out);
}

0

এটি কার্যকরভাবে এটি করে

"jim".match(/[^a-g]m/)
> ["im"]
"jam".match(/[^a-g]m/)
> null

অনুসন্ধান এবং প্রতিস্থাপন উদাহরণ

"jim jam".replace(/([^a-g])m/g, "$1M")
> "jiM jam"

মনে রাখবেন যে এটির কাজ করার জন্য নেতিবাচক চেহারা-পিছনের স্ট্রিংটি অবশ্যই 1 টি অক্ষরের দীর্ঘ হবে।


1
বেশ না। "জিম" এ, আমি "আই" চাই না; শুধু "মি" এবং পাশাপাশি "m".match(/[^a-g]m/)yeilds null। আমি সেই ক্ষেত্রে "এম "ও চাই।
অ্যান্ড্রু এনসলি

-1

/(?![abcdefg])[^abcdefg]m/gi হ্যাঁ এটি একটি কৌশল।


5
চেকটি (?![abcdefg])সম্পূর্ণরূপে অপ্রয়োজনীয়, যেহেতু [^abcdefg]এই চরিত্রটি মিলে যাওয়া থেকে রোধ করতে ইতিমধ্যে তার কাজ করেছে।
nhahtdh

2
এটি কোনও পূর্ববর্তী অক্ষরগুলির সাথে 'মি' এর সাথে মেলে না।
অ্যান্ড্রু এনসলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.