কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে স্ট্রিং পেতে রেজেক্স


115

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

আমি এই বিন্যাসে একটি স্ট্রিং মধ্যে পাস করতে চান {getThis}, এবং স্ট্রিং ফিরে আসতে getThis। আমার নতুন বছরের রেজোলিউশন আটকে রাখতে কেউ সাহায্য করতে পারে?


স্ট্যাক ওভারফ্লো সম্পর্কিত সম্পর্কিত প্রশ্ন:


5
এই প্রশ্নটি "অ্যাডভান্সড রেজেক্স-ফু" এর অধীনে স্ট্যাক ওভারফ্লো নিয়মিত এক্সপ্রেশন FAQ এ যুক্ত করা হয়েছে ।
aliteralmind

@ কোবি: FAQ একটি উইকি a যে কেউ এটি সম্পাদনা করতে পারবেন। সুতরাং এটি সম্পাদনা করুন।
aliteralmind

উত্তর:


44

যদি আপনার স্ট্রিং সর্বদা সেই বিন্যাসে থাকে তবে একটি রেজেক্স ওভারকিল হয়:

>>> var g='{getThis}';
>>> g.substring(1,g.length-1)
"getThis"

substring(1এর অর্থ একটি অক্ষর শুরু করা (কেবলমাত্র প্রথমটি অতীত হয়েছে {) এবং তার ,g.length-1)মানে অক্ষর স্ট্রিংয়ের দৈর্ঘ্যের বিয়োগফল পর্যন্ত (তবে অন্তর্ভুক্ত নয়) হওয়া উচিত take এটি কাজ করে কারণ অবস্থানটি শূন্য-ভিত্তিক, অর্থাৎ g.length-1শেষ অবস্থান।

মূল পোস্টার ছাড়া অন্য পাঠকদের জন্য: যদি গেছে একটি Regex, ব্যবহার হতে /{([^}]*)}/, যদি আপনি খালি স্ট্রিং অনুমতি দিতে চান বা /{([^}]+)}/আপনি শুধুমাত্র মেলে চান তাহলে যখন কোঁকড়া ধনুর্বন্ধনী মধ্যে অন্তত একটি চরিত্র। ভাঙ্গন:

  • /: রেজেক্স প্যাটার্ন শুরু করুন
    • {: একটি আক্ষরিক কোঁকড়া ধনুর্বন্ধনী
      • (: ক্যাপচারিং শুরু করুন
        • [: ক্যাপচারের জন্য অক্ষরের একটি শ্রেণির সংজ্ঞা দেওয়া শুরু করুন
          • ^}: "অন্য কিছু }"
        • ]: ঠিক আছে, এটি আমাদের পুরো শ্রেণীর সংজ্ঞা
        • *: যে শ্রেণীর সাথে মেলে এমন কোনও সংখ্যক অক্ষর আমরা কেবল সংজ্ঞায়িত করেছি
      • ): ক্যাপচারিং সম্পন্ন
    • }: একটি আক্ষরিক কোঁকড়া ধনুর্বন্ধনী অবশ্যই অবিলম্বে অনুসরণ করা উচিত যা আমরা বন্দী করেছি
  • /: রেজেক্স প্যাটার্নটি শেষ করুন

7
আপনি যে ভাষাতে কাজ করেন তার উপর ভিত্তি করে সাবস্ট্রিংিং হ'ল একটি জিনিস J , সি # আবার আলাদা ... সুন্দর এবং বিভ্রান্তিকর।
jvenema

2
... এবং পাইথনের স্লাইসিং রয়েছে, যা আইএমও অন্য যে কোনও কিছুর চেয়ে ভাল: পি।
অনুদান পল

27
মিষ্টি, তবে নিশ্চিত না কীভাবে এটি নিয়মিত প্রকাশ expression সম্ভবত তিনি রেগেক্সের জন্য জিজ্ঞাসা করেছিলেন, এবং আমি এখানে একই উত্তরের জন্য এসেছি .. দু: খজনকভাবে উত্তরটির প্রশ্নের সাথে কোনও সম্পর্ক নেই ..
বাশ05

5
@ বাশ05, আপনি যদি পুরো প্রশ্নটি পড়ে থাকেন তবে ওপি এমনকি রেজেক্সও শিখতে চায়নি, তাই আমি মনে করি না যে এটি এমন একাডেমিক অনুশীলন যা বলেছিল যে আপনি এটি বলেছিলেন বলে মনে হচ্ছে।
কেভ

2
আমি কি করতে -1 কারণ প্রশ্নের জন্য জিজ্ঞাসা করা হয় চেয়েছিলেন Regex , আমি অনুসন্ধানের জন্য ছিল Regex করেছি, কিন্তু স্বীকার উত্তর আমার জন্য সম্পূর্ণ অকেজো ছিল (একই প্রশ্ন খুব নিজেই প্রতিশ্রুতি করলো)। প্রথম মন্তব্যটি পড়ার পরে আমাকে অবশ্যই স্বীকার করতে হবে যে আমি যদি এই প্রশ্নের উত্তরটি প্রথমে দিতে পারি তবে আমি একই / একইভাবে উত্তর দিতে পারতাম ... সুতরাং শেষ পর্যন্ত, +1।
শায়ডিক্স

250

চেষ্টা

/{(.*?)}/

এর অর্থ, character এবং between এর মধ্যে যে কোনও চরিত্রের সাথে মিল রাখুন, তবে লোভী হবেন না - সংক্ষিপ্ত স্ট্রিংয়ের সাথে মেলে যা শেষ হয় the (?? লোভী হওয়া বন্ধ করে) দিয়ে। প্রথম বন্ধনী আপনাকে মিলে যাওয়া অংশটি বের করতে দেয়।

অন্য উপায় হবে

/{([^}]*)}/

এটি} চর (লোভী না হওয়ার অন্য উপায়) ব্যতীত অন্য কোনও চরিত্রের সাথে মেলে


এটি দুর্দান্ত, তবে কোঁকড়ানো-বন্ধনী-সংমিশ্রণের একটি পরিবর্তনশীল সংখ্যার মধ্যে কিছু মিলানো সম্ভব? উদাহরণস্বরূপ: "{এটি মিলে যাওয়া উচিত} এই উচিত নয় should এই কিন্ডার আবার হওয়া উচিত} এবং তাই {অন}"? আমি মানটি পুনরুদ্ধার করতে চাই যা কোঁকড়ানো বন্ধনীগুলির মধ্যে নেই। এছাড়াও: বাক্যগুলিতে কোঁকড়া বন্ধনী ব্যবহার করা হবে না এবং কোনও স্ট্যাকিং নেই (এটি কখনও ঘটবে না: "{কিছু {পাঠ্য}}")। কারও ধারণা কীভাবে এটি করবেন :)? ধন্যবাদ! (PS: এই সমাধানটি upvated)
ইগোর

4
এটি কোঁকড়ানো বন্ধনীগুলির মধ্যে সমস্ত কিছু ক্যাপচার করে না, এটি কোঁকড়া বন্ধনী এবং কোঁকড়া বন্ধনীগুলির মধ্যে সমস্ত কিছু ক্যাপচার করে। আপনি কীভাবে কেবল কোঁকড়ানো বন্ধনীগুলির ভিতরে থাকা ক্যাপচার করবেন?
বাস্তবতা-টরেন্ট

1
আমি এটি পছন্দ করি যে এখানে আপনার কোঁকড়ানো ধনুর্বন্ধনী থেকে পালানোর দরকার নেই কারণ রেজেক্স পার্সার বুঝতে পারে যে তারা কোনও কোয়ান্টিফায়ার নয় ... ঠিক আছে, আমি অজগরটিতে এটি করছি, তবে আমি মনে করি জাভাস্ক্রিপ্ট রেজিক্সগুলি এর মতো কাজ করে work খুব
ড্রেভিকো

3
gশেষে একটি যুক্ত করা এটি একটি বিশ্বব্যাপী অনুসন্ধান করে। একটি কাজের উদাহরণ দেখুন
বেনিয়ামিন

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

150
/\{([^}]+)\}/

/        - delimiter
\{       - opening literal brace escaped because it is a special character used for quantifiers eg {2,3}
(        - start capturing
[^}]     - character class consisting of
    ^    - not
    }    - a closing brace (no escaping necessary because special characters in a character class are different)
+        - one or more of the character class
)        - end capturing
\}       - the closing literal brace
/        - delimiter

@ মিউউ সা = এস স্প্লিট ("/ \ {([^}] +) \} /"); একটি সংকলন ত্রুটি দেয়। অবৈধ পুনরাবৃত্তি, অবৈধ পালানোর চরিত্র।
Likejudo

@ যদিও আপনি নিয়মিত প্রকাশের চেয়ে স্ট্রিংটিকে আপনার বিভক্ত যুক্তি হিসাবে ব্যবহার করছেন বলে মনে হচ্ছে। আপনি কি করতে চেষ্টা করছেন?
মিউউ

30

এটা চেষ্টা কর:

/[^{\}]+(?=})/g

উদাহরণ স্বরূপ

Welcome to RegExr v2.1 by #{gskinner.com},  #{ssd.sd} hosted by Media Temple!

ফিরে আসবে gskinner.com, ssd.sd


1
দুর্দান্ত, আপনি কেন \}প্রথম ব্লকে ব্যবহার করবেন তা ব্যাখ্যা করতে পারেন ?
উজায়ের আলী

1
দুর্দান্ত একটি, তবে এটি যে কোনও গ্রুপের সাথে শেষ হবে তার সাথে মিলবে }, এমনকি এটি শুরু না হলেও {
আহমদ ইব্রাহিম

1
এটি কেবলমাত্র সঠিক উত্তর যা আসলে কাজ করে works
pldg

ব্যাখ্যা: যদিও [^ \ {\}] + কোঁকড়ানো ধনুর্বন্ধনী নয় এমন কোনও কিছুর সাথে মিলবে, তবুও লুকোচুরি দৃ as়তা (? =}) কেবল একটি কোঁকড়া ধনুর্বন্ধনী পূর্ববর্তী বিভাগগুলি পাস করার বিষয়টি নিশ্চিত করবে। / ... / জি সহ আমরা সমস্ত ঘটনা পাই, কেবল প্রথমটি নয়।
0 -_- 0

19

জাভাস্ক্রিপ্ট প্রতিস্থাপন ব্যবহার করে এখানে একটি সহজ সমাধান

var st = '{getThis}';

st = st.replace(/\{|\}/gi,''); // "getThis"

উপরের স্বীকৃত উত্তরটি উল্লেখ করে যেহেতু মূল সমস্যাটি সাবস্ট্রিংয়ের সাহায্যে সহজেই সমাধান করা যায় তবে প্রতিস্থাপন ব্যবহার করা আরও জটিল ব্যবহারের ক্ষেত্রে সমাধান করতে পারে

আপনার যদি "এলোমেলো স্ট্রিং 999 [ক্ষেত্রের নাম]" এর মতো স্ট্রিং থাকে তবে আপনি ক্ষেত্রের নাম পেতে কিছুটা আলাদা প্যাটার্ন ব্যবহার করেন

var nameAttr = "randomstring999[fieldname]";

var justName = nameAttr.replace(/.*\[|\]/gi,''); // "fieldname"

15

এটি টেক্সমেটে কাজ করে এবং এটি কোঁকড়া বন্ধনীগুলির মধ্যে একটি সিএসএস ফাইলে সমস্ত কিছুর সাথে মেলে।

\{(\s*?.*?)*?\}

selector {. . matches here including white space. . .}

আপনি যদি আরও সামগ্রীতে ফিরে আসতে সক্ষম হতে চান, তবে এগুলি আরও ভালো করে বন্ধুত্বের আরও একটি সেটে মুড়িয়ে দিন:

\{((\s*?.*?)*?)\}

এবং আপনি $ 1 এর মাধ্যমে সামগ্রীগুলি অ্যাক্সেস করতে পারেন।

এটি ফাংশনগুলির জন্যও কাজ করে তবে আমি নেস্টেড কোঁকড়ানো বন্ধনী দ্বারা এটি পরীক্ষা করিনি।


14

আপনি রিজেক্স লুকহ্যাড এবং লুকবাইন্ড ব্যবহার করতে চান। এটি আপনাকে কোঁকড়া ধনুর্বন্ধনীগুলির মধ্যে যা কেবল তা দেবে:

(?<=\{)(.*?)(?=\})

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

1
ধন্যবাদ, এটি আজ আমাকে সাহায্য করেছে।
ProfessionalAmateur

এই পদ্ধতির কোনও অসুবিধা?
সোমটিক

5
@ সোমটিক — হ্যাঁ, নেতিবাচক চেহারা এবং পিছনে ECMAScript এ সমর্থিত নয়।
রবজি

দ্রষ্টব্য: এই উদাহরণটি জাভাতে কাজ করে। সমস্ত কোঁকড়া ধনুর্বন্ধনী মধ্যে সমস্ত মান প্রদান করে।
মাল্টিপ্লেক্সর

13

এটা চেষ্টা কর

let path = "/{id}/{name}/{age}";
const paramsPattern = /[^{\}]+(?=})/g;
let extractParams = path.match(paramsPattern);
console.log("extractParams", extractParams) // prints all the names between {} = ["id", "name", "age"]

1
আমি যা চেয়েছিলাম ঠিক
তেমন

চমৎকার, এখানে সেরা উত্তর।
michal.jakubeczy

4

বদ্ধ বক্রবন্ধনীযুক্ত স্ট্রিংয়ের অ্যারেগুলি পাওয়ার জন্য রেজেক্স কেবল প্রথম ঘটনাটি সন্ধান করার পরিবর্তে স্ট্রিংয়ে ঘটে।

 /\{([^}]+)\}/gm 

4

আমি অন্যান্য উত্তরগুলি সন্ধান করেছি এবং এগুলি থেকে একটি গুরুত্বপূর্ণ যুক্তি অনুপস্থিত মনে হচ্ছে। উদাহরণস্বরূপ, দুটি কনসেকটিভ বন্ধনীগুলির মধ্যে সবকিছু নির্বাচন করুন, কিন্তু বন্ধনী নয়

সুতরাং, এখানে আমার উত্তর

\{([^{}]+)\}

3
var re = /{(.*)}/;
var m = "{helloworld}".match(re);
if (m != null)
    console.log(m[0].replace(re, '$1'));

সহজ .replace(/.*{(.*)}.*/, '$1')দুর্ভাগ্যবশত সম্পূর্ণ পংক্তি ফেরৎ যদি Regex সাথে মিলছে না। উপরের কোড স্নিপেট আরও সহজেই একটি ম্যাচ সনাক্ত করতে পারে।



2

আপনি এই রেজেক্স পুনরাবৃত্তিটি ব্যবহার করতে পারেন প্রত্যেকটির মধ্যে, এমনকি অন্য কোনওটির সাথে {}(জেএসওএন পাঠ্যের মতো) মেলে :

\{([^()]|())*\}

দুর্দান্ত, তবে এটি কেবল নেস্টেড ধনুর্বন্ধনীগুলির মধ্যেই কন্টেন্টটি ধারণ করে
ডমিনিক


1

এমনকি এটি কারও সমস্যা সমাধানের চেষ্টা করার সময় আমাকে সহায়তা করে,

(কোঁকড়া ধনুর্বন্ধনী ভিতরে বিষয়বস্তু বিভক্ত {},) মত একটি প্যাটার্ন থাকার {'day': 1, 'count': 100}

উদাহরণ স্বরূপ:

#include <iostream> 
#include <regex> 
#include<string> 
using namespace std; 

int main() 
{ 
    //string to be searched
    string s = "{'day': 1, 'count': 100}, {'day': 2, 'count': 100}";

    // regex expression for pattern to be searched 
    regex e ("\\{[a-z':, 0-9]+\\}");
    regex_token_iterator<string::iterator> rend;

    regex_token_iterator<string::iterator> a ( s.begin(), s.end(), e );
    while (a!=rend) cout << " [" << *a++ << "]";
    cout << endl;

    return 0; 
}

আউটপুট:

[{'day': 1, 'count': 100}] [{'day': 2, 'count': 100}]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.