রেজেক্স: নির্দিষ্ট প্যাটার্নের সাথে সমস্ত কিছুর সাথে মেলে


310

আমার কাছে একটি রেইজেক্স দরকার যা সমস্ত কিছু মেলে তবে একটি স্ট্রিং নির্দিষ্ট প্যাটার্ন দিয়ে শুরু হয় (বিশেষত index.phpএবং এরপরে যা অনুসরণ করে, পছন্দ করে index.php?id=2342343)


এবং কোন নির্দিষ্ট প্যাটার্নটি আপনি মেলাতে চান না?
ডোমিনিক রজার

2
স্ট্রিংটির সাথে মেলে এমন কোনও কারণ রয়েছে যা আপনি আপনার প্যাটার্নের সাথে মেলে না এবং কিছু করতে পারবেন না?
টমাস ওভেনস


@ থমাস ওভেনস: এটি নির্ভর করে। এটি নির্ভর করে যে কোন অংশের অংশটি অবহেলিত হবে। পুরো প্রকাশটি যদি অবহেলা করা হয় তবে আপনি একটি বিষয় পেয়েছেন। উদাহরণস্বরূপ, আপনি যদি কোডিং করতে চান "যদি স্ট্রিংটিতে 'ব্রুস' একটি স্ট্রিং হিসাবে উপস্থিত না থাকে তবে কিছু করুন", আপনি স্পষ্টভাবে / ব্রুস / ব্যবহার করবেন, এবং যদি রেজেক্সের বাইরে আইএফ স্টেটমেন্টে অস্বীকৃতিটি রেখেছেন । তবে এটি এমন হতে পারে যে আপনি কিছু স্যুপ এক্সপ্রেসনটিকে অস্বীকার করতে চান। বলুন, আপনি ফার্স্ট নেম লাস্টনামের মতো কিছু সন্ধান করছেন, যেখানে প্রথম নাম ব্রুস এবং লাস্টনাম হ'ল এক্সওয়াইজেড ব্যতীত, যেখানে এক্সওয়াইজেড ব্রুস নামে পরিচিত কিছু সেলিব্রিটির শেষ নাম।
mathheadinclouds

উত্তর:


250

কোনও রেজিপ্স্প বিশেষজ্ঞ নয়, তবে আমি মনে করি আপনি প্রথম থেকেই নেতিবাচক চেহারা ব্যবহার করতে পারেন, উদাহরণস্বরূপ ^(?!foo).*$কোনও কিছুর সাথে মেলা উচিত নয় foo


7
গ্রেপ ব্যবহারের সাথে লুক-হেড সক্ষম করতে -পি ব্যবহার করুন।
সেপ্পো এনারভি

: আপনার পছন্দসই আচরণ মিলে হয় "foo বিন্যাস" বা "বার" না হলে, এই উত্তর চেক stackoverflow.com/a/2404330/874824
dave_k_smith

15
এই উত্তরটি ভুল, একটি দ্রুত পরীক্ষা এটি দেখায়। আমি মনে করি তুমি কি বোঝানো ^((?!foo).)*$( stackoverflow.com/a/406408/3964381 )
গিলাদ mayani

4
আপনি যে চিহ্নগুলি ব্যবহার করেছেন এবং কেন আপনি সেগুলি ব্যবহার করেছেন তা দয়া করে ব্যাখ্যা করতে পারেন?
রোটিমি-সেরা

339

রেজেক্স: সমস্ত কিছুর সাথে মেলে তবে :

  • একটি নির্দিষ্ট প্যাটার্ন দিয়ে শুরু হওয়া একটি স্ট্রিং (উদাহরণস্বরূপ যে কোনও - খালি, খুব - স্ট্রিংটি শুরু হচ্ছে না foo):
  • একটি নির্দিষ্ট প্যাটার্নের সাথে শেষ হওয়া একটি স্ট্রিং (বলে, world.শেষে নেই):
  • একটি স্ট্রিং ধারণকারী নির্দিষ্ট টেক্সট (বলুন, একটি স্ট্রিং থাকার সাথে মেলে না foo) (কোন POSIX অনুবর্তী patern, দুঃখিত):
  • একটি স্ট্রিং ধারণকারী নির্দিষ্ট চরিত্র (বলুন, এড়ানোর একটি স্ট্রিং একটি থাকার মিলে |প্রতীক):
  • কিছু স্ট্রিংয়ের সমান একটি স্ট্রিং (বলুন, এর সমান নয় foo):
  • একটি অক্ষর ক্রম :
    • পিসিআরই (কোনও পাঠ্যের সাথে মেলে তবে cat): /cat(*SKIP)(*FAIL)|[^c]*(?:c(?!at)[^c]*)*/iবা/cat(*SKIP)(*FAIL)|(?:(?!cat).)+/is
    • অন্য ইঞ্জিনগুলি বর্ণনাকে মঞ্জুরি দেয়: (cat)|[^c]*(?:c(?!at)[^c]*)*(বা (?s)(cat)|(?:(?!cat).)*, বা (cat)|[^c]+(?:c(?!at)[^c]*)*|(?:c(?!at)[^c]*)+[^c]*) এবং তারপরে ভাষার অর্থ পরীক্ষা করে দেখুন: যদি গ্রুপ 1 মিলছে তবে এটি আমাদের যা প্রয়োজন তা নয়, অন্যথায়, খালি না হলে ম্যাচের মানটি ধরুন
  • একটি নির্দিষ্ট একক অক্ষর বা অক্ষরের একটি সেট :

ডেমো দ্রষ্টব্য : \nপার্শ্ববর্তী লাইন (গুলি) এর সাথে ম্যাচের ওভারফ্লো এড়াতে ডেমোগুলিতে অবহেলিত চরিত্রের শ্রেণীর ভিতরে নতুন লাইন ব্যবহৃত হয়। পৃথক স্ট্রিং পরীক্ষা করার সময় এগুলি প্রয়োজনীয় নয়।

অ্যাঙ্কর দ্রষ্টব্য : \Aস্ট্রিংয়ের একেবারে প্রান্তটি সংজ্ঞায়িত করার জন্য অনেক ভাষায় স্ট্রিংয়ের দ্ব্যর্থহীন সূচনা সংজ্ঞায়িত করতে ব্যবহার করুন এবং \z(পাইথনে এটি \Zজাভাস্ক্রিপ্টে $ঠিক আছে)।

ডট নোট : অনেক স্বাদে (তবে পসিক্স, টিআরই, টিসিএল নয়), .কোনও লাইন চর ছাড়া অন্য কোনও চরকে মেলে । নিশ্চিত করুন যে আপনি একটি নতুন লাইন সহ যেকোন চরের সাথে মিলে যাওয়ার জন্য একটি প্রাসঙ্গিক ডটল মোডিফায়ার ( /sপিসিআরই / বুস্ট /। নেট / পাইথন / জাভা এবং /mরুবিতে) ব্যবহার করেছেন Make.

ব্যাকস্ল্যাশ নোট : LANGUAGES যেখানে আপনি (যেমন পালাবার ক্রম যার ফলে সি স্ট্রিং সঙ্গে নিদর্শন ডিক্লেয়ার করা আছে ইন \n, আপনি ব্যাকস্ল্যাশ বিশেষ অক্ষর তাই পলায়নের দ্বিগুণ ইঞ্জিন (আক্ষরিক অক্ষর তাদের আচরণ পারে প্রয়োজন একটি newline জন্য) যেমন জাভা, world\.হতে হবে হিসাবে ঘোষিত হয়েছে "world\\.", বা একটি অক্ষর শ্রেণি ব্যবহার করুন "world[.]":)। কাঁচা স্ট্রিং লিটারেলস (পাইথন r'\bworld\b'), সি # ভারব্যাটিম স্ট্রিং লিটারেলস @"world\.", বা স্ল্যাশ স্ট্রিং / রেজেক্স আক্ষরিক স্বরলিপিগুলি ব্যবহার করুন /world\./


দুর্দান্ত লেখার! উদাহরণস্বরূপ, "কিছু স্ট্রিংয়ের সমান একটি স্ট্রিং (নয়) এর ক্ষেত্রে ^(?!foo$), ডলার চিহ্নটি কাজ করার জন্য কেন বন্ধুত্বের মধ্যে থাকতে হবে? আমি ^(?!foo)$একই ফলাফল দেওয়ার প্রত্যাশা করছিলাম , তবে তা হয় না।
অনুদান হামফ্রিজ

3
@ গ্রান্টহামফ্রিজ: যখন $অ্যাঙ্করটি লুকোয়ারহেডের অভ্যন্তরে থাকে তখন এটি শর্তের একটি অংশ, সেই শূন্য প্রস্থের দৃser় অংশের অংশ । যদি এটি বাইরে থাকে তবে এর মতো ^(?!foo)$এটি স্ট্রিংয়ের শুরু হওয়ার পরে স্ট্রিংয়ের শেষের প্রয়োজন হয় এমন গ্রাসকারী প্যাটার্নের অংশ হবে যা নেতিবাচক বর্ণনাকে অপ্রাসঙ্গিক করে তোলে কারণ এটি সর্বদা সত্য ফিরে আসবে (স্ট্রিং শেষ হওয়ার পরে কোনও পাঠ্য থাকতে পারে না) , একা যাক foo)। সুতরাং, এর সাথে ^(?!foo$)মিলিত হয় না এমন একটি স্ট্রিংয়ের শুরু ম্যাচগুলি fooস্ট্রিং শেষের সাথে অনুসরণ করা হয়। ^(?!foo)$একটি খালি স্ট্রিংয়ের সাথে মেলে।
উইক্টর স্ট্রিবিউ

@ robots.txt এই মন্তব্যগুলি সরান দয়া করে। আপনি একটি এক্সওয়াই প্রশ্ন জিজ্ঞাসা করছেন। চরিত্রের ক্লাসগুলি একক অক্ষরের সাথে মেলে বোঝানো হয়, তাদের সাথে অক্ষরের ক্রম সংজ্ঞায়নের কোনও উপায় নেই। আপনার সম্ভবত একটি স্ট্রিংয়ের শুরু এবং প্রথম ঘটনার cotবা এর মধ্যে প্রথমটির মধ্যে স্ট্রিংগুলি খুঁজে পাওয়া উচিত lan, এবং ম্যাচটি মুছে ফেলুন, এর মতো regex.replace(myString, "^.*?(?:cot|lan)\s*", "")
উইক্টর স্ট্রিবিউউ

প্রিয় উইক্টর আপনি আমার প্রশ্নটি বন্ধ করেছেন তবে আপনার লিঙ্কিত উত্তর ব্যর্থ হয়েছে। আমি আমার প্রশ্নটি আপডেট করেছি stackoverflow.com/questions/60004380/…
মনস্টার এমএমআরপিজি

উদাহরণ হিসেবে বলা যায় আপনার সংযুক্ত উত্তর এই উদাহরণ ব্যর্থ "প্যাকেজ ing <! - ও ওয়েব পৃষ্ঠা <! - asdasasdas -> সম্পাদকদের এখন ব্যবহার -> আর্কাইভ"
MonsterMMORPG

259

আপনি ^এই অক্ষরগুলি ছাড়া আর কোনও কিছুর সাথে মিল রাখতে কোনও অক্ষর সেট শুরুতে রাখতে পারেন ।

[^=]*

সব মিলবে কিন্তু =


55
এটি সত্য, তবে এটি একবারে কেবল একটি চরিত্রকে প্রক্রিয়া করে। আপনি যদি দুটি বা ততোধিক অক্ষরের অনুক্রমকে বাদ দিতে চান তবে অন্যান্য প্রতিক্রিয়াকারীদের মতো আপনাকে নেতিবাচক চেহারা হিসাবে ব্যবহার করতে হবে।
অ্যালান মুর

নিখুঁত সমাধান আপনি যে কোনও অনাকাঙ্ক্ষিত চরিত্রকে মুছে ফেলুন কিন্তু প্যাটার্নে রয়েছে। ধন্যবাদ
স্যার্মি নিজে

@ অ্যালান, "... আপনাকে একটি নেতিবাচক চেহারা অবলম্বন করতে হবে ..." ভুল, তবে আমাদের আপনার পক্ষে খুব বেশি কঠিন হওয়া উচিত নয় কারণ ভিক্টর তার উত্তর পোস্ট করেন নি - যা দেখায় - কেন 2016
ক্যারি সোভোল্যান্ড

6

ঠিক মেলে /^index\.php/তবে যা কিছু মেলে তা প্রত্যাখ্যান করুন।


সম্ভবত লিখিত str !~ /\Aindex\.php/
কেরি সোভোল্যান্ড

6

অজগরে:

>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

3
এটি "সূচক_এফপি" বা "সূচক # পিএইচপি" প্রত্যাখ্যান করবে।

1

আমি একটি Regex সক্ষম প্রয়োজন সবকিছু মেলে কিন্তু ছাড়া একটি দিয়ে শুরু স্ট্রিং index.php একটি নির্দিষ্ট প্যাটার্ন (বিশেষভাবে index.php এবং কি অনুসরণ করে, index.php মত? আইডি = 2342343)

ব্যবহারের পদ্ধতি Exec এর

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

বা অন্য ম্যাচ

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

রিজেক্স ব্যবহার না করা সম্পর্কে:

// In PHP
0 !== strpos($string, 'index.php')

11
ওপি বিশেষত একটি রেজেক্সের জন্য অনুরোধ করেছে ... আমি নিশ্চিত না যে এটি সাহায্য করে! ( grepউদাহরণস্বরূপ, তিনি কমান্ড-লাইনে বা পার্ল / পাইথন / অন্য কোনও ভাষা ব্যবহার করতে পারেন, বা কোনও পাঠ্য সম্পাদকের মধ্যে "প্রতিটি রেখার জন্য এই রেজেক্সটি কার্যকর করুন" ইত্যাদি))
রিনোগো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.