জাভাস্ক্রিপ্টে দুটি স্ট্রিংয়ের মধ্যে স্ট্রিং পেতে নিয়মিত প্রকাশ


166

আমি খুব অনুরূপ পোস্ট পেয়েছি, তবে আমি এখনই আমার নিয়মিত প্রকাশটি পেতে পারছি না।

আমি একটি নিয়মিত ভাব প্রকাশ করার চেষ্টা করছি যা দুটি স্ট্রিংয়ের মধ্যে থাকা একটি স্ট্রিং দেয় returns উদাহরণস্বরূপ: আমি স্ট্রিংটি পেতে চাই যা "গাভী" এবং "দুধ" স্ট্রিংয়ের মধ্যে থাকে।

আমার গরু সর্বদা দুধ দেয়

ফিরে আসবে

"সর্বদা দেয়"

আমি এখন পর্যন্ত একসাথে বেঁধে রেখেছি এমন প্রকাশটি এখানে:

(?=cow).*(?=milk)

যাইহোক, এটি "গরু সর্বদা দেয়" স্ট্রিংটি দেয়।


6
আমি এই পুরানো প্রশ্নটিতে হোঁচট খেয়েছি এবং স্পষ্ট করতে চেয়েছিলাম কেন টেস্টআরআই একটি অ্যারে। টেস্ট.ম্যাচ মোট সূচক হিসাবে প্রথম সূচক সহ একটি অ্যারে প্রদান করে (থারফোর্ড, গরু (। *) দুধের সাথে মেলে এমন স্ট্রিং) এবং তারপরে, সমস্ত আটকা পড়া স্ট্রিং ((* *) এর মতো থাকে যদি তাদের দ্বিতীয় বন্ধনীর প্রথম সেট থাকে তবে তারপরে পরীক্ষায় থাকুন [2]
সালকেটার

4
আপনি যদি নতুন লাইনের সমন্বিত স্ট্রিংটি অনুসন্ধান করে থাকেন তবে এই সমাধানটি কাজ করবে না। এই জাতীয় ক্ষেত্রে, আপনার "STRING_ONE ([\\ s \\ S] *?) STRING_TWO" ব্যবহার করা উচিত। stackoverflow.com/questions/22531252/…
মাইকেল.লুমলে

উত্তর:


183

একটি চেহারা ( (?=কোনও অংশ) কোনও ইনপুট গ্রহণ করে না। এটি একটি শূন্য-প্রস্থের প্রতিলিপি (যেমন সীমানা চেক এবং লুকবাইন্ডগুলি রয়েছে)।

cowঅংশটি গ্রাস করতে আপনি এখানে নিয়মিত মিল চান । অংশটির মধ্যবর্তী অংশটি ক্যাপচার করার জন্য, আপনি একটি ক্যাপচারিং গ্রুপ ব্যবহার করুন (প্যাটার্নেসিসের ভিতরে আপনি যে প্যাটার্নটির ক্যাপচার করতে চান সেটি কেবল রাখুন):

cow(.*)milk

কোনও লুক-হেডের দরকার নেই।


26
আমি যখন এটি পরীক্ষা করি, প্রদত্ত রেজেেক্স এক্সপ্রেশনটিতে "গরু" এবং "দুধ" উভয়ই অন্তর্ভুক্ত থাকে ...
থেস্যাক্যাসাডিয়ান

4
এটি একটি পদক্ষেপ অনুপস্থিত। আপনি যখন ম্যাচের ফলাফল পেয়েছেন, আপনার সাথে প্রথম ক্যাপচারিং গোষ্ঠীর ম্যাচযুক্ত পাঠ্যটি উত্তোলন করতে হবে, এর সাথে matched[1]পুরো ম্যাচযুক্ত পাঠ্যটি নয় matched[0]
ররি ও'কেনে

7
জাভাস্ক্রিপ্টে, আসলে আপনার ([\s\S]*?)পরিবর্তে ব্যবহার করা দরকার (.*?)
কিয়ান চেন

7
যদিও এটি একটি দরকারী টেকিক, তবুও এটি নিম্নোক্ত হয়েছিল কারণ আইএমএইচও এটি প্রশ্নের সঠিক উত্তর নয়, কারণ এতে "গরু" এবং "দুধ" অন্তর্ভুক্ত রয়েছে, যেমনটি @ দ্য ক্যাসাচাদিয়ান দ্বারা বিবৃত
ক্যাম্পোস

@ আলমির ক্যাম্পোস - যদি আমার ভুল না হয় তবে "গাভী" এবং "দুধ" না মিলিয়ে এই ম্যাচটি করার কোনও উপায় নেই (যেহেতু আপনি এই দুজনের মধ্যে যা আছে তা মেলাতে চান)। সমস্যাটি নিজেই রেজিএক্সের নয় তবে আপনি কীভাবে এটি পরে পরিচালনা করবেন (যেমন ররি ওকেন উল্লেখ করেছেন)। অন্যথায় আপনি কেবল আশেপাশের জায়গাগুলির জন্যই মেলে ফেলতে পারেন - এবং এটি আপনাকে খুব ভুল ফেরত দেবে, তাই না?
জন্ম

69

জাভাস্ক্রিপ্টে দুটি স্ট্রিংয়ের মধ্যে স্ট্রিং পেতে নিয়মিত প্রকাশ

সর্বাধিক সম্পূর্ণ সমাধান যা বেশিরভাগ ক্ষেত্রে কাজ করবে তা হ'ল একটি অলস বিন্দু মিলে যাওয়ার প্যাটার্ন সহ একটি ক্যাপচারিং গ্রুপ ব্যবহার করা । যাইহোক, একটি বিন্দু জাভাস্ক্রিপ্ট Regex লাইন বিরতি অক্ষর মেলে না, তাই, কি 100% ক্ষেত্রেই কাজ করবে একটি হল বা / / নির্মান।.[^][\s\S][\d\D][\w\W]

ECMAScript 2018 এবং আরও নতুন সামঞ্জস্যপূর্ণ সমাধান

ইসকামাস্ক্রিপ্ট 2018 সমর্থনকারী জাভাস্ক্রিপ্ট পরিবেশে , sসংশোধক .লাইন ব্রেক ব্রেক সহ যে কোনও চরকে মেলাতে অনুমতি দেয় এবং রেজেক্স ইঞ্জিনটি চলক দৈর্ঘ্যের লুকবিহিনগুলি সমর্থন করে। সুতরাং, আপনি একটি regex মত ব্যবহার করতে পারেন

var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional

উভয় ক্ষেত্রেই, বর্তমান অবস্থান cowপরে যেকোন 1/0 বা আরও শ্বেত স্পেসের জন্য পরীক্ষা করা হয় cow, তারপরে যত কম 0+ অক্ষর মিলিত হয় এবং সেবন করা হয় (= ম্যাচের মানটিতে যোগ করা হয়), এবং তারপরে milkপরীক্ষা করা হয় (যে কোনও সহ) এই স্ট্রিংয়ের আগে 1/0 বা আরও শ্বেতস্থান)।

দৃশ্য 1: একক লাইন ইনপুট

এই এবং নীচের সমস্ত অন্যান্য পরিস্থিতিতে সমস্ত জাভাস্ক্রিপ্ট পরিবেশ দ্বারা সমর্থিত। উত্তরের নীচে ব্যবহারের উদাহরণগুলি দেখুন।

cow (.*?) milk

cowপ্রথমে পাওয়া যাবে, তারপরে একটি স্পেস, তারপরে লাইন ব্রেক ব্রেক ছাড়া অন্য যে কোনও 0+ অক্ষর, *?অলস কোয়ান্টিফায়ার হিসাবে যত কম সম্ভব , তাকে গ্রুপ 1 এ বন্দী করা হবে এবং তারপরে একটি স্থান milkঅবশ্যই অনুসরণ করবে (এবং সেগুলি মিলে যায় এবং গ্রাসও হয়) )।

দৃশ্য 2: একাধিক ইনপুট

cow ([\s\S]*?) milk

এখানে, cowএবং একটি স্পেসটি প্রথমে মিলিত হয়, তারপরে যত কম 0+ অক্ষর মিলে যায় এবং তাদের গ্রুপ 1 এ ক্যাপচার করা হয়, এবং তার সাথে একটি স্পেস milkমেলাতে হয়।

দৃশ্য 3: ওভারল্যাপিং ম্যাচগুলি

তোমার মত একটি স্ট্রিং থাকে >>>15 text>>>67 text2>>>এবং আপনি 2 ম্যাচ পেতে প্রয়োজন মধ্যবর্তী >>>+ + number+ + whitespaceএবং >>>, আপনি ব্যবহার করতে পারবেন না />>>\d+\s(.*?)>>>/gআসলে কারণে এই হিসাবে শুধুমাত্র 1 টি মিল পাবেন >>>আগে 67থেকেই খাওয়া প্রথম ম্যাচ খোঁজার উপর। আপনি আসলে এটি "গব্বলিং" না করে পাঠ্য উপস্থিতি যাচাই করতে একটি ইতিবাচক চেহারা ব্যবহার করতে পারেন (অর্থাত্ ম্যাচে সংযোজন):

/>>>\d+\s(.*?)(?=>>>)/g

দেখুন অনলাইন Regex ডেমো ফলনশীল text1এবং text2গোষ্ঠী হিসাবে 1 বিষয়বস্তু খুঁজে পাওয়া যায়নি।

এছাড়াও স্ট্রিংয়ের জন্য সমস্ত সম্ভাব্য ওভারল্যাপিং ম্যাচগুলি কীভাবে পাবেন তা দেখুন ।

পারফরম্যান্স বিবেচনা

.*?খুব দীর্ঘ ইনপুট দেওয়া থাকলে রেজেেক্স প্যাটার্নের ভিতরে অলস ডট মিলের প্যাটার্ন ( ) স্ক্রিপ্টের প্রয়োগকে ধীর করতে পারে। অনেক ক্ষেত্রে, আনোলোল-দ্য লুপ কৌশলটি আরও বেশি পরিমাণে সহায়তা করে। এর মধ্য থেকে cowএবং এগুলি দখলের চেষ্টা করে আমরা দেখতে পাচ্ছি যে আমাদের কেবল সমস্ত লাইনের সাথে মিলিয়ে নেওয়া দরকার যা শুরু হয় না , এইভাবে পরিবর্তে আমরা ব্যবহার করতে পারি:milk"Their\ncow\ngives\nmore\nmilk"milkcow\n([\s\S]*?)\nmilk

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm

দেখুন Regex ডেমো (হতে পারে যদি \r\n, ব্যবহার /cow\r?\n(.*(?:\r?\n(?!milk$).*)*)\r?\nmilk/gm)। এই ছোট পরীক্ষার স্ট্রিংয়ের সাথে, পারফরম্যান্স লাভটি নগণ্য, তবে খুব বড় পাঠ্যের সাহায্যে আপনি পার্থক্যটি অনুভব করবেন (বিশেষত যদি লাইন দীর্ঘ হয় এবং লাইন বিরতি খুব বেশি না হয়)।

জাভাস্ক্রিপ্টে নমুনা রেগেক্স ব্যবহার:

//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);

আধুনিক String#matchAllপদ্ধতি ব্যবহার করে

const s = "My cow always gives milk, thier cow also gives milk";
const matches = s.matchAll(/cow (.*?) milk/g);
console.log(Array.from(matches, x => x[1]));


51

এখানে একটি রেজেক্স যা গাভী এবং দুধের মধ্যে যা আছে তা দখল করবে (অগ্রণী / পিছনে স্থান ছাড়াই):

srctext = "My cow always gives milk.";
var re = /(.*cow\s+)(.*)(\s+milk.*)/;
var newtext = srctext.replace(re, "$2");

একটি উদাহরণ: http://jsfiddle.net/entropo/tkP74/


17
  • আপনি ক্যাপচার প্রয়োজন .*
  • আপনি .*ননগ্রাডি করতে পারেন (তবে করতে হবে না)
  • তাকাতে আসলেই দরকার নেই।

    > /cow(.*?)milk/i.exec('My cow always gives milk');
    ["cow always gives milk", " always gives "]
    

এই বিশেষ উদাহরণে, যদি এটি লোভী হয় তবে এটি শেষ এবং ব্যাকট্র্যাকে পৌঁছতে পারে (সম্ভবত)।
বেন

9

নির্বাচিত উত্তরটি আমার পক্ষে কার্যকর হয়নি ... হুম ...

"সর্বদা দেয়" থেকে স্পেস ছাঁটাই করতে কেবল গাভীর পরে এবং / অথবা দুধের আগে স্থান যুক্ত করুন

/(?<=cow ).*(?= milk)/

এখানে চিত্র বর্ণনা লিখুন


আপনার নিজের উত্তর সম্পর্কে মন্তব্য করার দরকার নেই, কেবল এটি সম্পাদনা করুন।
কোডি G

?<=জাভাস্ক্রিপ্টে লুক বিহাইন্ড সমর্থিত নয়।
মার্ক কার্পেন্টার জুনিয়র

@ মার্ককার্পেন্টার জুনিয়র যদি আপনি এটি regextester.com এর মাধ্যমে পরীক্ষা করেন তবে আপনি সেই ইঙ্গিতটি পাবেন। দেখে মনে হচ্ছে সাইটটি তার নিয়মগুলি পুরানো স্পেসিফিকেশন থেকে তৈরি করেছে। লুকহাইন্ড এখন সমর্থিত। Stackoverflow.com/questions/30118815/… দেখুন এবং প্যাটার্নটি ত্রুটি ছাড়াই আধুনিক ব্রাউজারগুলির সাথে ভালভাবে কাজ করে। পরিবর্তে এই পরীক্ষকটি
duduwe

@ কোডিজি.হাহ। বুঝেছি.
দুদুয়ে

8

নীচে মার্টিনহো ফার্নান্দেসের সমাধান ব্যবহার করে যা প্রয়োজন তা আমি পেয়েছিলাম। কোডটি হ'ল:

var test = "My cow always gives milk";

var testRE = test.match("cow(.*)milk");
alert(testRE[1]);

আপনি লক্ষ্য করবেন যে আমি অ্যারে হিসাবে টেস্টআর ভেরিয়েবলটি সতর্ক করছি। এটি কারণ কারণে টেস্টআররি কোনও কারণে অ্যারে হিসাবে ফিরছে। থেকে আউটপুট:

My cow always gives milk

এর মধ্যে পরিবর্তনগুলি:

always gives

1
ধন্যবাদ, আমি এর জন্য একটি ফিডল ( jsfiddle.net/MoscaPt/g5Lngjx8/2 ) যুক্ত করেছি। / জোহান
মোছা পিটি

4

কেবলমাত্র নিম্নলিখিত নিয়মিত প্রকাশটি ব্যবহার করুন:

(?<=My cow\s).*?(?=\smilk)

?<=জাভাস্ক্রিপ্টে লুক বিহাইন্ড সমর্থিত নয়। যদিও এটি করার উপায় হবে।
মার্ক কার্পেন্টার জুনিয়র

এটি জাভাস্ক্রিপ্টে সমর্থিত। এটি কেবল ক্রোম এবং অপেরাতে সাফারি এবং মজিলায় (এখনও) সমর্থিত নয়।
পল স্ট্রুপিকিস

3

সিনট্যাক্সের ভিত্তিতে আমি রেজেক্সকে ক্লান্তিকর এবং সময় সাপেক্ষ বলে মনে করি। যেহেতু আপনি ইতিমধ্যে জাভাস্ক্রিপ্ট ব্যবহার করছেন রেজেক্স ছাড়াই নিম্নলিখিতগুলি করা আরও সহজ:

const text = 'My cow always gives milk'
const start = `cow`;
const end = `milk`;
const middleText = text.split(start)[1].split(end)[0]
console.log(middleText) // prints "always gives"

2
আমার জন্য কাজ কর! চমত্কার উত্তর কারণ এটি সত্যিই সহজ! :)
অ্যান্ড্রু ইরউইন


0

পদ্ধতি ম্যাচ () ম্যাচের জন্য একটি স্ট্রিং সন্ধান করে এবং একটি অ্যারে অবজেক্ট ফেরত দেয়।

// Original string
var str = "My cow always gives milk";

// Using index [0] would return<br/>
// "**cow always gives milk**"
str.match(/cow(.*)milk/)**[0]**


// Using index **[1]** would return
// "**always gives**"
str.match(/cow(.*)milk/)[1]

0

কার্য

দুটি স্ট্রিংয়ের মধ্যে সাবস্ট্রিং বের করুন (এই দুটি স্ট্রিং বাদে)

সমাধান

let allText = "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum";
let textBefore = "five centuries,";
let textAfter = "electronic typesetting";
var regExp = new RegExp(`(?<=${textBefore}\\s)(.+?)(?=\\s+${textAfter})`, "g");
var results = regExp.exec(allText);
if (results && results.length > 1) {
    console.log(results[0]);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.