কীভাবে "রেজিস্টের সাথে বিপরীত ম্যাচ" করবেন?


112

আমি রেজেক্সবাডি ব্যবহার করছি তবে যাই হোক আমি এই জিনিসটি নিয়ে সমস্যায় আছি: \

আমি লাইন দিয়ে একটি ফাইল প্রক্রিয়া করছি। আমি যা চাই তা মেলে আমি একটি "লাইন মডেল" তৈরি করেছি।

এখন আমি একটি বিপরীতমুখী ম্যাচটি করতে চাই ... অর্থাৎ আমি যেখানে letters টি বর্ণের একটি স্ট্রিং রয়েছে সেখানে লাইনগুলি মেলাতে চাই, তবে এই ছয়টি অক্ষর যদি আন্দ্রে না হয় তবে আমার কীভাবে তা করা উচিত?


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

আমি আশা করি এই প্রশ্নটি পরিষ্কার করে দিয়েছে :)


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

উত্তর:


70
(?!Andrea).{6}

আপনার রিজএক্সপ্স ইঞ্জিনটি ধরে নেওয়া নেতিবাচক বর্ণনীদের সমর্থন করে ..

সম্পাদনা: .. অথবা সম্ভবত আপনি তার [A-Za-z]{6}জায়গায় ব্যবহার করতে পছন্দ করেন.{6}

সম্পাদনা (আবার): নোট করুন যে লুক হেডস এবং লুকবিহিন্ডগুলি নিয়মিত প্রকাশের ম্যাচটিকে "বিপরীত" করার সঠিক উপায় নয়। নেতিবাচক মিলটি করার জন্য রিজেক্সপসটি সত্যই সেট আপ করা হয় না, আপনি যে ভাষা ব্যবহার করছেন সেটিকে তারা ছেড়ে দেয়।


আপনাকে @ ভিঙ্কো ভ্র্যাসালোভিক যে uses টি ব্যবহার করতে হবে তা যোগ করতে হবে যাতে এটি "এনড্রিয়া on n" এর সাথে মেলে না
বিডুকস

2
। ডিফল্টরূপে \ n এর সাথে মেলে না (কিছু ভাষাগুলি [যেমন পার্ল] আপনাকে সেই আচরণটি স্যুইচ করতে দেয় তবে ডিফল্টরূপে।
ড্যান

1
(প্লাস, ওপি কখনই রেখার শুরুতে স্ট্রিংটি ঘটতে পারে নি উল্লেখ করে)
ড্যান

1
ওপি বলতে কি বোঝ?
আন্দ্রে অম্বু

1
আন্দ্রে: ওপি এর অর্থ "আসল পোস্টার", সুতরাং, আমি আপনাকে উল্লেখ করছি :)
ড্যান

47

পাইথন / জাভার জন্য,

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html


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

এটি কোন ভাষায় লিখিত আছে তা জানেন না, তবে আমার পরীক্ষার ডেটা সাফ করার জন্য সাব্লাইম পাঠ্যে মনোযোগের মতো কাজ করেছেন। ধন্যবাদ!
ম্যাথিয়াস ডারিক্স

1
@ অ্যালানমুর আসলে, এটি প্রায় এই ব্যবহারের ক্ষেত্রে কাজ করবে। যাইহোক, যদি some textলাইনটি শুরু হয় তবে এটি ভুল ফলাফল প্রদান করবে।
জেনেক্সার

2
@ জেনেক্সার, আমি এটাই বোঝাতে চাইছি যদি বিন্দুটি পূর্বের পরিবর্তে লুকোচুরির পরে থাকে তবে এটি পুরোপুরি কার্যকর হয়।
অ্যালান মুর

এখানে একটি লিঙ্ক রয়েছে যা আরও ব্যাখ্যা করে। আমি বুঝতে পারছি ?!না কেন এবং ঠিক নয় !
টিমো

21

অ্যালান মুরের প্রতিক্রিয়া সহ আপডেট হয়েছে

পিসিআরই এবং অনুরূপ রূপগুলিতে আপনি আসলে একটি রেইজেক্স তৈরি করতে পারেন যা কোনও মান সহ কোনও লাইনের সাথে মেলে:

^(?:(?!Andrea).)*$

একে মজাদার লোভী টোকেন বলে । খারাপ দিকটি এটি ভাল পারফর্ম করে না।


1
এটি দীর্ঘ আকারে টেম্পার্ড লোভী টোকেন। শুধু ডট (বা করা [\s\S]দ্বিতীয় lookahead পর যা JavaScript একমাত্র দরকারী), এবং আপনি প্রথমটি প্রয়োজন হবে না: ^(?:(?!Andrea).)*$
অ্যালান মুর

নিবন্ধন করুন এটির মতো কাজ করে এমন কোনও প্রতিষ্ঠিত প্যাটার্ন আমি পাইনি, তাই আমি নিজের সাথে এসেছি। আমাকে আপনার উত্তর নেওয়ার পরিবর্তে আপনার নিজের হিসাবে এটি সরবরাহ করা উচিত।
জেনেক্সার

এটি ঠিক আছে, ইতিমধ্যে প্রচুর ভাল উত্তর রয়েছে। এবং আপনি নিজেরাই এই প্রতিমাটি আবিষ্কার করার জন্য creditণ প্রাপ্য। চিয়ার্স!
অ্যালান মুর

আপনি ব্যবহারের পরামর্শ দিচ্ছেন কেন [\S\s]? ওপি "অ্যান্ড्रिया" শব্দটি ধারণ করে না, লাইনগুলি মিলানোর বিষয়ে কথা বলছে। পুরো স্ট্রিংয়ে এই শব্দটি রয়েছে কিনা তা যাচাইয়ের বিষয়ে নয়। আমি কিছু অনুপস্থিত করছি?
এক্স-ইয়ুরি

@ এক্স-ইউরি আমি মনে করি আপনি ঠিক বলেছেন। আমি সম্ভবত আমার এই প্রশ্নের উত্তর দিয়েছিলাম যে আমি প্রথমে এই পৃষ্ঠাটি গিয়েছিলাম, বৈষম্য উপেক্ষা করে। আমার সংযোগটি এখনই উত্তর আপডেট করার পক্ষে যথেষ্ট ভাল নয়, যদিও (<10 কেবিপিএস)
জেনেক্সার

11

আপনি কোন ভাষা ব্যবহার করছেন? এর জন্য রেজেক্স বাস্তবায়নের বিষয়গুলির ক্ষমতা এবং বাক্য গঠন।

আপনি চেহারা এগিয়ে ব্যবহার করতে পারেন। অজগর উদাহরণ হিসাবে ব্যবহার করা

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

এটি ভেঙে ফেলার জন্য:

(?! Andrea) এর অর্থ 'পরের 6 টি অক্ষর "Andrea" না হলে মিল! যদি তাই হয়

\ ডব্লিউর অর্থ "শব্দের চরিত্র" - বর্ণমালা। এটি শ্রেণীর সমান [a-zA-Z0-9_]

\ w {6} এর অর্থ হ'ল 6 শব্দ বর্ণ word

পুনঃনিররেস মানে হল যে আপনি "অ্যান্ড্রিয়া", "আন্দ্রেয়া", " আ্যান্ড্রেইয়া " কে বাদ দেবেন ...

আরেকটি উপায় হ'ল আপনার প্রোগ্রামের যুক্তি ব্যবহার করা - আন্ড্রেয়ার সাথে মেলে না এমন সমস্ত লাইন ব্যবহার করুন এবং 6 টি অক্ষর পরীক্ষা করার জন্য এটিকে দ্বিতীয় রেজেক্সের মাধ্যমে রাখুন। অথবা প্রথমে কমপক্ষে 6 টি শব্দের অক্ষরের জন্য চেক করুন এবং তারপরে এটি আন্ড্রেয়ার সাথে মেলে না তা পরীক্ষা করুন।


7

নেতিবাচক বর্ণনাহীন দাবি

(?!Andrea)

এটি হুবহু একটি উল্টানো ম্যাচ নয়, তবে আপনি সরাসরি রেগেক্সের সাহায্যে সেরা করতে পারেন। যদিও সমস্ত প্ল্যাটফর্ম তাদের সমর্থন করে না।


1
প্রশ্নকারীর স্পষ্টতা না পাওয়া পর্যন্ত আমি দেখতে পাচ্ছি না যে ম্যাচটি লাইনের শুরুতে শুরু করতে হবে at তাহলে কেন?
হামিশ ডাউনার

কারণ আমি বুঝতে পেরেছিলাম যে তিনি লাইনের শুরুতে যাচাই করতে চেয়েছিলেন, প্রদত্ত স্পষ্টতাগুলি সম্পাদনা করেছেন
ভিঙ্কো ভার্সালোভিক

5

আপনি যদি রেজেক্সবাডিতে এটি করতে চান তবে একটি রেজেক্সের সাথে মেলে না এমন সমস্ত লাইনের একটি তালিকা পাওয়ার দুটি উপায় রয়েছে।

টেস্ট প্যানেলে সরঞ্জামদণ্ডে, পরীক্ষার সুযোগটি "লাইন বাই লাইনে" সেট করুন। আপনি যখন এটি করেন, ম্যাচগুলি ব্যতীত সমস্ত আইনের তালিকা একই সরঞ্জামদণ্ডে সমস্ত তালিকা তালিকার তালিকায় প্রদর্শিত হবে। (আপনি যদি সমস্ত তালিকা তালিকার বাটনটি না দেখতে পান তবে প্রধান সরঞ্জামদণ্ডে ম্যাচ বোতামটি ক্লিক করুন))

জিআরআরপি প্যানেলে, আপনি যে ফাইলগুলির মাধ্যমে গ্রেপ করছেন সেগুলিতে মিল না-পাওয়া লাইনগুলির একটি তালিকা পেতে আপনি "লাইন-ভিত্তিক" এবং "বিপরীত ফলাফল" চেকবক্সগুলিকে চালু করতে পারেন।


5

(?!অনুশীলনে দরকারী। যদিও কঠোরভাবে বলা, সামনের দিকে তাকানো গণিত হিসাবে সংজ্ঞায়িত হিসাবে নিয়মিত প্রকাশ নয়।

আপনি নিজেই একটি উল্টানো নিয়মিত অভিব্যক্তি লিখতে পারেন।

ফলাফলটি স্বয়ংক্রিয়ভাবে গণনা করার জন্য এখানে একটি প্রোগ্রাম । এর ফলাফলটি মেশিন দ্বারা উত্পাদিত হয় যা সাধারণত হাত লেখার চেয়ে অনেক জটিল। তবে ফলাফল কাজ করে।


1

আমি কেবল এই পদ্ধতিটি নিয়ে এসেছি যা হার্ডওয়্যার নিবিড় হতে পারে তবে এটি কাজ করছে:

আপনি খালি স্ট্রিং দ্বারা রেজেক্সের সাথে মেলে এমন সমস্ত অক্ষর প্রতিস্থাপন করতে পারেন।

এটি হ'ল অনায়িক:

notMatched = re.sub(regex, "", string)

আমি এটি ব্যবহার করেছি কারণ আমাকে খুব জটিল রেইগেক্স ব্যবহার করতে বাধ্য করা হয়েছিল এবং এটির প্রতিটি অংশ কীভাবে যুক্তিসঙ্গত সময়ের মধ্যে উল্টানো যায় তা বুঝতে পারি না।

এটি কেবল আপনাকে স্ট্রিং ফলাফল প্রদান করবে, কোনও মিলের বস্তু নয়!


-3

পার্ল আপনি করতে পারেন

প্রক্রিয়া ($ লাইন) যদি ($ লাইন = ~! / আন্দ্রে /);


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