সদৃশ শব্দের জন্য নিয়মিত এক্সপ্রেশন


114

আমি একটি নিয়মিত অভিব্যক্তি নবাগত এবং আমি কোনও একক নিয়মিত অভিব্যক্তি কীভাবে লিখতে পারি তা কোনওভাবেই নকল টানা শব্দের সাথে "মেলে" যায় তা আমি যথেষ্ট বুঝতে পারি না:

প্যারিসে বসন্ত।

না যে সম্পর্কিত হয়।

হাসছ কেন? হয় আমার আমার রেগুলার এক্সপ্রেশনের যে খারাপ ??

সেখানে কি এমন একক নিয়মিত ভাব আছে যা উপরের সমস্ত সাহসিকতার সাথে মেলে?


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

13
"এটি কর্মক্ষেত্রের প্রশ্নের মতো কিছুটা মনে হচ্ছে। এটি কি?" এবং তারপরে লোকেরা বিতর্ক করবে যদি স্ট্যাক ওভারফ্লো কারও কাজ করে।
মার্সিও

@ জোশুয়া +1 আপনি যে রিজেক্স সমাধানটি গ্রহণ করেছেন সে সম্পর্কে শ্রদ্ধা জানিয়ে আপনি কি দয়া করে আমাকে বলবেন যে আমি জোড়গুলির একটি উপাদান (যেমন, not that that is related-> not that is related) দ্বারা প্রতিস্থাপনের ম্যাচগুলি (নকল) কীভাবে প্রতিস্থাপন করতে পারি ? অগ্রিম ধন্যবাদ
এন্টোইন

@ জোশুয়া আমার ধারণা আমি সমাধানটি পেয়েছি: আমার প্রতিস্থাপন করা উচিত \1!
এন্টোইন

2
@ ডেভিডলেল কীভাবে \b(\w+)\s+(\1\s*)+\b?
ytu

উত্তর:


141

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

\b(\w+)\s+\1\b

এখানে \bএকটি শব্দ সীমানা দেওয়া হয়েছে এবং \1প্রথম দলের ক্যাপচারিত ম্যাচটি উল্লেখ করা হয়েছে।


1
আমাকে অবাক করে; \0এটাও কি সম্ভব ? ( \0বর্তমানের বিন্দু \0
অবধি

@ পিন্ডতজুঃ না, আমি মনে করি না কারণ উপ-ম্যাচটিও পুরো ম্যাচের অংশ হবে।
গম্বো

কমপক্ষে Eclipse অনুসন্ধান / প্রতিস্থাপন কথোপকথনে ব্যবহৃত regex ইঞ্জিনে কাজ করে।
বিশৃঙ্খলা_99

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

3
তদ্ব্যতীত, এটি ট্রিপলিকেটগুলি (বা আরও) ধরবে না, যখন কোনও ডুপ / ট্রিপলিকেট স্ট্রিংয়ের শেষে হয়
নিকো

20

আমি বিশ্বাস করি এই রেজেক্স আরও পরিস্থিতি পরিচালনা করে:

/(\b\S+\b)\s+\b\1\b/

পরীক্ষার স্ট্রিংগুলির একটি ভাল নির্বাচন এখানে পাওয়া যাবে: http://callumacrae.github.com/regex-t মঙ্গলবার / চ্যালেঞ্জ 1.html


দুর্দান্ত, অ্যাস্টোস্ট্রোফস / হাইফেনস / ইত্যাদি নিয়ে কাজ করে। খুব - ধন্যবাদ!

চ্যালেঞ্জ 1 লিঙ্কের জন্য, আপনি শ্রেণিবদ্ধ শব্দটি ব্যবহার করতে প্রতিস্থাপনের জায়গায় কী রাখবেন? চেষ্টা করেছেন <strong>\0</strong>কিন্তু কাজ করছেন না।
uptownhr

2
এটি ট্রিপলিকেটগুলি (বা আরও বেশি) ধরবে না, যখন কোনও ডুপ / ট্রিপলিকেট স্ট্রিংয়ের শেষে হয়
নিকো

@uptownhr আপনি ব্যবহার করতে চান $1 <strong>$2</strong>। তবে বিভিন্ন রেজেেক্স ব্যবহার করুন /\b(\S+) (\1)\b/gi। এখানে একটি লিঙ্ক দেওয়া হয়েছে: কলুমাক্রাই.
github.io/regex-t

এবং যদি আমি কোনও নির্দিষ্ট ট্যাগ থেকে পরপর সমস্ত শব্দ খুঁজে পেতে চাই, যেমন <p class="bebe">bla bla</p> আমি কীভাবে এই রেজেক্স সূত্রকে সংহত করতে পারি?
জাস্ট মি

7

নীচে আরই সঙ্গে এটি চেষ্টা করুন

  • word b শব্দের সীমানার শুরু
  • \ ডাব্লু + যে কোনও শব্দের চরিত্র
  • Same 1 একই শব্দ ইতিমধ্যে মেলে
  • শব্দের সমাপ্তি
  • () * আবার পুনরাবৃত্তি

    public static void main(String[] args) {
    
        String regex = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*";//  "/* Write a RegEx matching repeated words here. */";
        Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE/* Insert the correct Pattern flag here.*/);
    
        Scanner in = new Scanner(System.in);
    
        int numSentences = Integer.parseInt(in.nextLine());
    
        while (numSentences-- > 0) {
            String input = in.nextLine();
    
            Matcher m = p.matcher(input);
    
            // Check for subsequences of input that match the compiled pattern
            while (m.find()) {
                input = input.replaceAll(m.group(0),m.group(1));
            }
    
            // Prints the modified sentence.
            System.out.println(input);
        }
    
        in.close();
    }

5

বহুল ব্যবহৃত পিসিআরই লাইব্রেরি এ জাতীয় পরিস্থিতিগুলি পরিচালনা করতে পারে ( যদিও আপনি পসিক্স -কমপ্লায়েন্ট রিজেক্স ইঞ্জিনগুলির সাথে এটি অর্জন করতে পারবেন না ):

(\b\w+\b)\W+\1

আপনি অক্ষর মেলে কিছু প্রয়োজন মধ্যে মত, দুটি শব্দ \W+\bএটি করবে না, কারণ এটি কোনও অক্ষর গ্রাস করে না।
অ্যালান মুর

এটি সম্ভাব্য ক্ষেত্রে যেমন ভুল-পজিটিভ মিল খুঁজে পেতে পারে ... the these problems...। এই দ্রবণটি গম্বোর প্যাটার্নের সাধারণ কাঠামোর মতো নির্ভরযোগ্য নয় যা শব্দ সীমানাকে পর্যাপ্ত পরিমাণে কার্যকর করে।
মিকম্যাকুসা

এবং যদি আমি কোনও নির্দিষ্ট ট্যাগ থেকে পরপর সমস্ত শব্দ খুঁজতে চাই, যেমন<p class="bebe">bla bla</p> আমি কীভাবে এই রেজেক্স সূত্রকে সংহত করতে পারি?
জাস্ট মি

4

আমার টুইচ বটে ডুপ্লিকেট বাক্যাংশ সরাতে আমি এটি ব্যবহার করি:

(\S+\s*)\1{2,}

(\S+\s*) এমন কোনও অক্ষরের সন্ধান করুন যা শ্বেতস্পেস নয়, অনুসরণ করা শ্বেতস্পেস নয়।

\1{2,}তারপরে ম্যাচের জন্য স্ট্রিংটিতে সেই বাক্যটির 2 টিরও বেশি উদাহরণ সন্ধান করুন। যদি 3 টি শব্দগুচ্ছ একই থাকে তবে এটি মেলে।


এই উত্তরটি বিভ্রান্তিকর। এটি সদৃশ শিকার করে না, এটি 3 বা ততোধিক ঘটনা সহ সাবস্ট্রিংগুলি শিকার করে। \s*ক্যাপচার গ্রুপে থাকার কারণে এটি খুব শক্তিশালীও নয় । এই বিক্ষোভ দেখুন: regex101.com/r/JtCdd6/1
মিকম্যাকুসা

তদুপরি চরম ক্ষেত্রে (নিম্ন-ফ্রিকোয়েন্সি পাঠ্য) মিথ্যা ধনাত্মক মিল তৈরি করে। যেমন I said "oioioi" that's some wicked mistressship!অনoioioisss
মিকম্যাকুসা

4

নিচের অভিব্যক্তিটি টানা কয়েকটি শব্দ খুঁজে পেতে সঠিকভাবে কাজ করা উচিত। মিলটি সংবেদনশীল হতে পারে।

String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

Matcher m = p.matcher(input);

// Check for subsequences of input that match the compiled pattern
while (m.find()) {
     input = input.replaceAll(m.group(0), m.group(1));
}

নমুনা ইনপুট: বিদায় বিদায় GooDbYe

নমুনা আউটপুট: বিদায়

ব্যাখ্যা:

রেজেক্স এক্সপ্রেশন:

\ বি: একটি শব্দের সীমানা শুরু

\ ডাব্লু +: শব্দের অক্ষরের যে কোনও সংখ্যা

(\ s + \ 1 \ b) *: শব্দের পরে যে কোনও স্পেস রয়েছে যা পূর্ববর্তী শব্দের সাথে মেলে এবং শব্দের সীমানা শেষ করে। * মোড়ানো পুরো জিনিসটি একাধিক পুনরাবৃত্তি সন্ধান করতে সহায়তা করে।

দলবদ্ধকরণ:

m.group (0): উপরের ক্ষেত্রে বিদায়ের গুডবাই গুডবাইয়ের সাথে ম্যাচের গ্রুপটি থাকতে পারে

m.group (1): উপরের ক্ষেত্রে বিদায় বিধি হিসাবে মিলিত প্যাটার্নের প্রথম শব্দটি থাকতে পারে

প্রতিস্থাপন পদ্ধতিটি শব্দের প্রথম উদাহরণের সাথে টানা সমস্ত মিলিত শব্দের প্রতিস্থাপন করবে।


3

না এটি একটি অনিয়মিত ব্যাকরণ। আপনি ব্যবহার করতে পারেন এমন ইঞ্জিন- / ভাষা-নির্দিষ্ট নিয়মিত এক্সপ্রেশন থাকতে পারে, তবে এটি করতে পারে এমন কোনও সার্বজনীন নিয়মিত প্রকাশ নেই।


12
কঠোর অর্থে সঠিক হওয়া সত্ত্বেও, আমি বিশ্বাস করি যে গুরুতর ব্যবহারে আর কোনও রেগেক্স ইঞ্জিন নেই যা গোষ্ঠীকরণ এবং ব্যাক-রেফারেন্সগুলিকে সমর্থন করে না।
তোমালাক

3

এখানে একাধিকবার একাধিক শব্দ ধরা আছে:

(\b\w+\b)(\s+\1)+

এবং যদি আমি কোনও নির্দিষ্ট ট্যাগ থেকে পরপর সমস্ত শব্দ খুঁজতে চাই, যেমন <p class="bebe">bla bla</p>আমি কীভাবে এই রেজেক্স সূত্রকে সংহত করতে পারি?
জাস্ট মি

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

আমি নিজের উত্তরটি খুঁজে পেয়েছি<p class="bebe">.*?\b\s+(\w+)\b\K\s+\1\s+\b(?=.*?<\/p>)
জাস্ট মি

3

রেগেক্স থেকে স্ট্রিপ 2+ নকল শব্দ (ধারাবাহিক / অ-পরপর শব্দ)

এই রেজেক্সটি চেষ্টা করুন যা 2 বা ততোধিক ডুপ্লিকেট শব্দ ধরতে পারে এবং কেবল একটি শব্দের পিছনে ছেড়ে যায়। এবং সদৃশ শব্দগুলি একটানা হওয়াও দরকার নেই

/\b(\w+)\b(?=.*?\b\1\b)/ig

এখানে, \bশব্দ সীমানা ?=জন্য ব্যবহার করা হয়, ইতিবাচক চেহারা \1জন্য ব্যবহৃত হয় , এবং ফিরে-রেফারেন্সিং জন্য ব্যবহৃত হয়।

উদাহরণ উত্স


1
অবিচ্ছিন্ন একটি খারাপ ধারণা: "the cat sat on the mat"->" cat sat on the mat"
ওয়ালফ

@ ওয়াল্ফ ট্রু তবুও, এমন পরিস্থিতি রয়েছে যেখানে এটি উদ্দেশ্যযুক্ত। (উদাহরণস্বরূপ: স্ক্র্যাপিং ডেটা সহ)
পাঠক

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

হ্যাঁ, এটি ভুল ছিল, অনুলিপিটি অনুলিপি করা হয়েছে। আসলে আমার উদাহরণ থেকে একটি অনুলিপি করার উদ্দেশ্যে। যাইহোক, এখন এটি কাজ করে! এত ভাল! ধন্যবাদ!
নিকেত পাঠক

2

জাভাস্ক্রিপ্টের উদাহরণ: গুড পার্টসগুলি এটি করার জন্য রূপান্তর করা যেতে পারে:

var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1(?:\s|$)/gi;

bound b শব্দের সীমানার জন্য \ w ব্যবহার করে, যেখানে \ w [0-9A-Z_a-z] এর সমতুল্য। আপনি যদি এই সীমাবদ্ধতাটিকে আপত্তি না করেন তবে গৃহীত উত্তরটি ঠিক আছে।


2

যেহেতু কিছু বিকাশকারী এই পৃষ্ঠায় এমন কোনও সমাধানের সন্ধানে আসছেন যা কেবলমাত্র অনবরূপ নন-হোয়াইটস্পেস সাবস্ট্রিংগুলিই সরিয়ে দেয়, তবে ট্রিপলিকেট এবং তার বাইরেও, আমি অভিযোজিত প্যাটার্নটি দেখাব।

প্যাটার্ন: /(\b\S+)(?:\s+\1\b)+/( প্যাটার্ন ডেমো )
প্রতিস্থাপন:$1 (ক্যাপচার গ্রুপ # 1 এর সাথে পুরো স্ট্রিং ম্যাচের পরিবর্তে)

এই প্যাটার্নটি লোভের সাথে একটি "পুরো" অ-শ্বেতস্পেস স্ট্রিংয়ের সাথে মেলে, তারপরে ম্যাচযুক্ত স্ট্রস্ট্রিংয়ের এক বা একাধিক অনুলিপি প্রয়োজন যা এক বা একাধিক সাদা বর্ণের অক্ষর (স্পেস, ট্যাব, নিউলাইন ইত্যাদি) দ্বারা বিস্মৃত হতে পারে।

বিশেষ করে:

  • \b (শব্দ সীমানা) অক্ষরগুলি আংশিক শব্দের সাথে মেলে না তা নিশ্চিত করার জন্য গুরুত্বপূর্ণ।
  • দ্বিতীয় প্যারেন্টিথিকাল একটি নন-ক্যাপচারিং গ্রুপ, কারণ এই পরিবর্তনশীল প্রস্থের স্ট্রিংগুলিকে ক্যাপচার করার দরকার নেই - কেবল মিলিত / শোষিত।
  • +(এক বা একাধিক কোয়ান্টিফায়ার) অ ক্যাপচার দলের উপর চেয়ে বেশি উপযুক্ত* কারণ *ক্যাপচার করার Regex ইঞ্জিন "বিরক্ত" এবং ঘটনার Singleton প্রতিস্থাপন করবে - এই অযথা প্যাটার্ন নকশা।

* নোট করুন আপনি যদি বাক্যগুলি বা ইনপুট স্ট্রিংগুলিকে বিরামচিহ্ন দিয়ে কাজ করছেন তবে প্যাটার্নটি আরও পরিমার্জন করা দরকার।


@ অ্যাডাম জোনস আপনার পিএইচপি প্রকল্পে এই প্যাটার্নটি ব্যবহার করুন। নিকোর উত্তরের কিছু অযৌক্তিক বাক্য গঠন রয়েছে।
মিকম্যাকুসা

1

এই অভিব্যক্তিটি (উপরে মাইকের দ্বারা অনুপ্রাণিত হয়েছে) স্ট্রিংয়ের শেষে থাকা সমস্ত নকল, ট্রিপলিকেট ইত্যাদিতে ধরা পড়েছে, যা অন্যদের অধিকাংশই না:

/(^|\s+)(\S+)(($|\s+)\2)+/g, "$1$2")

আমি জানি ডুপ্লিকেটগুলি মেলে জিজ্ঞাসা করা প্রশ্নটি শুধুমাত্র, কিন্তু একটি তৃতীয়ক মাত্র 2 সদৃশ একে অপরের :) পাশে

প্রথমত, আমি (^|\s+)এটি নিশ্চিত করেছিলাম যে এটি পুরো শব্দ দিয়ে শুরু হয়, অন্যথায় "সন্তানের স্টেক" "চাইল্ডটিক" ("এর" এর সাথে মিলবে) যেতে হবে। তারপরে, এটি সমস্ত পূর্ণ শব্দের সাথে মেলে ( (\b\S+\b)), তারপরে স্ট্রিংয়ের শেষে ( $) বা অনেকগুলি স্পেস (\s+ ), সম্পূর্ণ একাধিকবার পুনরাবৃত্তি হয়েছিল।

আমি এটির মতো চেষ্টা করেছি এবং এটি ভালভাবে কাজ করেছে:

var s = "here here here     here is ahi-ahi ahi-ahi ahi-ahi joe's joe's joe's joe's joe's the result result     result";
print( s.replace( /(\b\S+\b)(($|\s+)\1)+/g, "$1"))         
--> here is ahi-ahi joe's the result

পিএইচপি-তে এটি পুনরায় লিখতে আমার সমস্যা হচ্ছে, আমি নকল / ত্রিপ্লেকেট ইত্যাদির প্রতিটি ঘটনাকে প্রতিস্থাপন করে মিলে যাওয়া নকলের একক অনুলিপি পেয়েছি vital ($ | \ s +) \ 2) + / im ',' $ 0 ', $ স্ট্রিং);
আদম জোন্স

এটি সেরা উত্তর। আমি ঠিক এর \bমতো শেষ যোগ করে একটি টুইট করেছি: /(^|\s+)(\S+)(($|\s+)\2)+\b/g, "$1$2")এটি এর পরে এই জাতীয় পরিস্থিতিতে কাজ the the string String string stringing the the along the the stringকরবে : the string stringing the along the stringবিজ্ঞপ্তিতে পরিণত হবে string stringing। এটি আপনার উত্তরের সাথে মিলছে। ধন্যবাদ.
স্টে

-1

আপনি সদৃশ শব্দের জন্য কেস-সংবেদনশীল চেক করতে চাইলে এটি ব্যবহার করুন।

(?i)\\b(\\w+)\\s+\\1\\b

কেস-সংবেদনশীল প্যাটার্ন সংশোধক ব্যবহার করা আপনার প্যাটার্নটির জন্য কোনও ব্যবহার নয়। পতাকাটি প্রভাবিত করার জন্য কোনও লেটার রেঞ্জ নেই।
মিকম্যাকুসা

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