জাভাস্ক্রিপ্ট রেজেক্স - বিকল্প পিছনে তাকান?


142

এখানে একটি রেইজেক্স রয়েছে যা বেশিরভাগ রিজেেক্স বাস্তবায়নে সূক্ষ্মভাবে কাজ করে:

(?<!filename)\.js$

এটি স্ট্রিংয়ের সাথে .js এর সাথে মেলে যা ফাইলনাম.জেএস ব্যতীত .js দিয়ে শেষ হয়

জাভাস্ক্রিপ্টে রিজেক্স লুকের পিছনে নেই। কেউ কি কোনও বিকল্প রেজেক্স একসাথে রাখতে সক্ষম যা একই ফলাফল অর্জন করে এবং জাভাস্ক্রিপ্টে কাজ করে?

এখানে কিছু চিন্তাভাবনা রয়েছে, তবে সহায়ক ফাংশন প্রয়োজন। আমি কেবল একটি রেইজেক্সের মাধ্যমে এটি অর্জনের আশা করছিলাম: http://blog.stevenlevithan.com/archives/mimic-lookbehind-javascript


3
আপনার যদি কেবল একটি নির্দিষ্ট ফাইলের নাম বা ফাইলের তালিকা পরীক্ষা করতে হয় তবে কেন কেবল দুটি চেক ব্যবহার করবেন না? এটি .js এ শেষ হয় কিনা তা পরীক্ষা করুন এবং তারপরে এটি যদি হয় তবে এটি ফাইলের সাথে মেলে না কিনা পরীক্ষা করুন j
si28719e

3
আপডেট: সর্বশেষ সর্বজনীন ক্রোম সংস্করণ (v62) এর মধ্যে (সম্ভবত পরীক্ষামূলক) বাক্সের পিছনের চেহারা রয়েছে: ডি নোট তবে দেখুন যে নজরদারিগুলি এখনও প্রস্তাবের পর্যায়ে রয়েছে 3: github.com/tc39/proposal-regexp- lookbehind । সুতরাং, জাভাস্ক্রিপ্ট সর্বত্র এটি সমর্থন করতে কিছুক্ষণ সময় নিতে পারে। উত্পাদন ব্যবহার সম্পর্কে সতর্কতা অবলম্বন করা ভাল!
এরিক বার্কল্যান্ড

2
# আপডেট: ES2018 এ নজরদারি অনুসারে প্লাস অন্তর্ভুক্ত রয়েছে : - ডটআল মোড (গুলি) - দৃষ্টিকোণ অনুসারে - নামকৃত ক্যাপচার গ্রুপগুলি - ইউনিকোড সম্পত্তি পালিয়ে যায়
অ্যাশলি কুলম্যান

2
শুধু ব্যবহার (?<=thingy)thingyজন্য ইতিবাচক lookbehind এবং (?<!thingy)thingyজন্য নেতিবাচক lookbehindএখন এটি তাদের সমর্থন করে।
Константин Ван

7
@ কে ._ ফেব্রুয়ারী 2018 এর হিসাবে এটি এখনও সত্য নয় !! এবং এটি কিছুটা সময় প্রয়োজন কারণ ব্রাউজার এবং ইঞ্জিনগুলি অবশ্যই স্পেসিফিকেশন (খসড়াতে বর্তমান) বাস্তবায়ন করতে পারে।
আন্দ্রে ফিগুয়েরেদো

উত্তর:


64

^(?!filename).+\.js আমার জন্য কাজ কর

এর বিরুদ্ধে পরীক্ষিত:

  • test.js ম্যাচ
  • blabla.js ম্যাচ
  • filename.js কোনও মিল নেই

এই রেজেক্সের জন্য একটি সঠিক ব্যাখ্যা পাওয়া যাবে নিয়মিত অভিব্যক্তিটিতে স্ট্রিংয়ের সাথে কোন শব্দ নেই?

জাভাস্ক্রিপ্টের 1.5 সংস্করণ থেকে পাওয়া দেখুন এবং সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত

Filename2.js এবং 2filename.js এর সাথে মেলে আপডেট হয়েছে তবে ফাইলের নাম.জেএস নয়

(^(?!filename\.js$).).+\.js


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

এটি সত্যিই দুর্দান্ত, এটি কেবলমাত্র ফাইল-নাম 2.js বা ফাইল-নামক.জেএস বা এই জাতীয় ক্ষেত্রে বাদ দেয়। এটি কোনও মিল নয়, তবে ম্যাচ হওয়া উচিত।
ড্যানিয়েল

9
@ ডানিয়েল আপনি সামনের দিকে চেয়েছিলেন না, পিছনে চেয়েছিলেন, আপনি কেন এই উত্তরটি মেনে নিয়েছেন?
hek2mgl

1
প্রদত্ত একটির সাথে মেলে নাa.js
অনাদিকাল

1
লুকবাইন্ডের সাথে মূল রেজেক্সটি মেলে না 2filename.js, তবে এখানে দেওয়া রেজেক্সটি মিলছে। আরও উপযুক্ত এক হবে ^(?!.*filename\.js$).*\.js$। এর অর্থ, *.js বাদে যেকোনও সাথে মেলে *filename.js
ওয়েবেল্ড

152

সম্পাদনা: ECMAScript 2018 থেকে পরবর্তী দৃষ্টিকোণ (এমনকি আনবাউন্ডেড) স্থানীয়ভাবে সমর্থিত

পূর্ববর্তী সংস্করণগুলিতে, আপনি এটি করতে পারেন:

^(?:(?!filename\.js$).)*\.js$

লুকবাইন্ড এক্সপ্রেশন স্পষ্টভাবে যা করছে তা এটি স্পষ্টভাবে করে: স্ট্রিংয়ের প্রতিটি চরিত্রটি যদি লম্বহাইন্ড এক্সপ্রেশন প্লাসের সাথে রেজেক্সের সাথে মেলে না তবে এটি পরীক্ষা করুন এবং কেবলমাত্র সেই অক্ষরটি মেলানোর অনুমতি দিন।

^                 # Start of string
(?:               # Try to match the following:
 (?!              # First assert that we can't match the following:
  filename\.js    # filename.js 
  $               # and end-of-string
 )                # End of negative lookahead
 .                # Match any character
)*                # Repeat as needed
\.js              # Match .js
$                 # End of string

অন্য সম্পাদনা:

এটি বলতে আমার কষ্ট হয় (বিশেষত যেহেতু এই উত্তরটি এতটা বাড়ানো হয়েছে) যে এই লক্ষ্যটি অর্জনের জন্য আরও সহজ উপায় রয়েছে। প্রতিটি চরিত্রের দিকে তাকাতে হবে না:

^(?!.*filename\.js$).*\.js$

ঠিক পাশাপাশি কাজ করে:

^                 # Start of string
(?!               # Assert that we can't match the following:
 .*               # any string, 
  filename\.js    # followed by filename.js
  $               # and end-of-string
)                 # End of negative lookahead
.*                # Match any string
\.js              # Match .js
$                 # End of string

পূর্বের অক্ষরগুলি ব্যতীত প্রচুর ক্ষেত্রে কাজ করে, উদাহরণস্বরূপ: filename.js (work-nomatch) filename2.js (work-match) blah.js (কাজ - মিল) 2filename.js (কাজ করে না - nomatch) --- এই বলে যে, চেহারাটির পিছনে একই সীমাবদ্ধতা রয়েছে যা আমি এখনও অবধি বুঝতে পারি নি ...
ড্যানিয়েল

9
@ ড্যানিয়েল: আচ্ছা, আপনার রেজেক্স (ম্যাচটি পিছনের দিকের সাথে )ও মেলে না 2filename.js। আমার রেজেক্স আপনার উদাহরণের রেজেক্সের সাথে ঠিক একই ক্ষেত্রে মেলে।
টিম পিটজেকার

আমার নির্দোষকে ক্ষমা করুন কিন্তু এখানে নন ক্যাপচারিং গ্রুপের কোনও ব্যবহার আছে কি? আমি সর্বদা জেনেছি যে স্ট্রিংয়ের প্রতিস্থাপনের জন্য রেফারেন্স ফিরে ফেলার চেষ্টা করার সময় কেবল এটি কার্যকর হবে। যতদুর আমি জানি, খুব কাজ করবে ^ (?! ফাইলের নাম \ .js $) * \ JS
আমি উত্তর চান

1
মোটেও তা নয়, এই রেজেেক্স কেবল স্ট্রিংয়ের শুরুতে "filename.js" অনুসন্ধান করে। কিন্তু ^(?!.*filename\.js$).*\.js$কাজ করবে। এনসিগ্রুপ এখনও প্রয়োজনীয় হতে পারে এমন পরিস্থিতিতে চিন্তা করার চেষ্টা করা ...
টিম পিটজেকার

এই পদ্ধতির সংক্ষিপ্তসারটি দেওয়া যেতে পারে: এক্সকে পিছনে দেখার পরিবর্তে এক্স এর আগে উপস্থিত প্রতিটি চরিত্রের দিকে চেয়ে দেখুন?
সরসপরিলা

25

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

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

(?<!unsigned )int

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

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

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

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

(?<!filename)\.js$

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

((?!filename).{8}|^.{0,7})\.js$

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


আমি শুধু এই রূপান্তরিত: (?<!barna)(?<!ene)(?<!en)(?<!erne) (?:sin|vår)e?(?:$| (?!egen|egne))থেকে (?!barna).(?!erne).(?!ene).(?!en).. (?:sin|vår)e?(?:$| (?!egen|egne))যা আমার প্রয়োজনের জন্য কৌতুক আছে। এটি অন্য "রিয়েল-ওয়ার্ল্ড" দৃশ্য হিসাবে সরবরাহ করে। লিঙ্কটি
Eirik বার্কল্যান্ড 13

আমার মনে হয় আপনি বোঝানো:((?!unsigned ).{9}|^.{0,8})int
pansay

@ পানসে হ্যাঁ ধন্যবাদ. আমি শুধু আমার প্রতিক্রিয়া সংশোধন করেছি।
কামিল জাজোট

2
পাঠ্যের অভ্যন্তরে গভীর মিলের প্রয়োজন থাকা সত্ত্বেও আরও সাধারণীকরণের উত্তরের জন্য ধন্যবাদ (যেখানে প্রাথমিক imp অযৌক্তিক হবে)!
মিলোস মার্ডোভিচ

5

আপনি যদি এগিয়ে তবে পিছনে সন্ধান করতে পারেন তবে আপনি প্রথমে স্ট্রিংটি বিপরীত করতে পারেন এবং তারপরে একটি লুকো হেড করতে পারেন। অবশ্যই আরও কিছু কাজ করা দরকার।


8
এই উত্তরটি কিছুটা উন্নতি করতে পারে। এটা আমার কাছে একটি মন্তব্য মত মনে হচ্ছে।
মিকম্যাকুসা

2

এটি টিম পিটজ্যাকারের উত্তরের সমতুল্য সমাধান (একই উত্তরের মন্তব্যও দেখুন):

^(?!.*filename\.js$).*\.js$

এর অর্থ, মিল *.jsছাড়া *filename.js

এই সমাধানটিতে পৌঁছানোর জন্য, আপনি কোন প্যাটার্নগুলি নেতিবাচক লুকের পিছনে বাদ দেয় তা যাচাই করতে পারেন এবং তারপরে নেতিবাচক লুকের সাথে ঠিক এই প্যাটার্নগুলি বাদ দিতে পারেন।


-1

নীচে জাভাস্ক্রিপ্টের বিকল্পের পিছনে একটি ইতিবাচক চেহারা রয়েছে যা দেখিয়েছে কীভাবে 'মাইকেল' সহ লোকের প্রথম নামটি তাদের প্রথম নাম হিসাবে ক্যাপচার করতে হয়।

1) এই পাঠ্য দেওয়া:

const exampleText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";

মাইকেল নামের লোকের শেষ নামগুলির একটি অ্যারে পান। ফলাফলটি হওয়া উচিত:["Jordan","Johnson","Green","Wood"]

2) সমাধান:

function getMichaelLastName2(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(person.indexOf(' ')+1));
}

// or even
    .map(person => person.slice(8)); // since we know the length of "Michael "

3) সমাধান পরীক্ষা করুন

console.log(JSON.stringify(    getMichaelLastName(exampleText)    ));
// ["Jordan","Johnson","Green","Wood"]

ডেমো এখানে: http://codepen.io/PiotrBerebecki/pen/GjwRoo

আপনি নীচের স্নিপেট চালিয়ে চেষ্টা করে দেখতে পারেন।

const inputText = "Michael, how are you? - Cool, how is John Williamns and Michael Jordan? I don't know but Michael Johnson is fine. Michael do you still score points with LeBron James, Michael Green Miller and Michael Wood?";



function getMichaelLastName(text) {
  return text
    .match(/(?:Michael )([A-Z][a-z]+)/g)
    .map(person => person.slice(8));
}

console.log(JSON.stringify(    getMichaelLastName(inputText)    ));

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