প্রদত্ত প্রত্যয় দিয়ে স্ট্রিংয়ের শেষ নেই for


188

কোনও শর্ত না দিয়ে শেষ হওয়া কোনও স্ট্রিংয়ের সাথে ম্যাচ করার জন্য আমি একটি সঠিক রেজেক্স খুঁজে পাইনি । উদাহরণস্বরূপ, আমি কোনওটি দিয়ে শেষ হওয়া কোনওটির সাথে মিলতে চাই না a

এই মেলে

b
ab
1

এটি মেলে না

a
ba

আমি জানি $রেগেক্স শেষ হওয়া উচিত শেষ হিসাবে চিহ্নিত করা, যদিও আমি জানি না এটির আগে কী করা উচিত।

সম্পাদনা : আসল প্রশ্নটি আমার মামলার বৈধ উদাহরণ বলে মনে হচ্ছে না। সুতরাং: একাধিক চরিত্র কীভাবে পরিচালনা করবেন? কিছু দিয়ে শেষ হচ্ছে না ab?

আমি এই থ্রেডটি ব্যবহার করে এটি ঠিক করতে সক্ষম হয়েছি :

.*(?:(?!ab).).$

যদিও এর সাথে নেতিবাচক দিকটি রয়েছে তবে এটি একটি অক্ষরের স্ট্রিংয়ের সাথে মেলে না।


5
এটি লিঙ্কযুক্ত প্রশ্নের সদৃশ নয় - কেবল শেষের সাথে মিলে গেলে স্ট্রিংয়ের মধ্যে কোথাও মিলের চেয়ে আলাদা বাক্য গঠন প্রয়োজন। শুধু এখানে শীর্ষ উত্তর দেখুন।
জাস্টিন 4'15

আমি সম্মত, এটি লিঙ্কিত প্রশ্নের সদৃশ নয় । আমি ভাবছি কীভাবে আমরা উপরের "চিহ্নগুলি" সরাতে পারি?
অ্যালান ক্যাবেরা

এমন কোনও লিঙ্ক নেই যা আমি দেখতে পাচ্ছি।
অ্যালান ক্যাবেরা

উত্তর:


249

আপনি আমাদেরকে ভাষা দিতে হবে না, কিন্তু যদি আপনার Regex গন্ধ সমর্থন কথন পিছনে তাকান , এই আপনার যা প্রয়োজন হয়:

.*(?<!a)$

(?<!a)স্ট্রিং শেষ হওয়ার আগে (বা mসংশোধক সহ সারি ), "ক" অক্ষরটি নেই এমনটি নিশ্চিত করে একটি অবহেলিত নজরদারি দাবি

এটি রেগেক্সারে এখানে দেখুন

স্ট্রিংগুলির জন্য এটি যাচাই করে নেওয়া এবং কোনও অক্ষর শ্রেণি নয় বলে আপনি অন্যান্য অক্ষরগুলির সাথে এটি সহজেই প্রসারিত করতে পারেন।

.*(?<!ab)$

এটি "আব" দিয়ে শেষ হয় না এমন কোনও কিছুর সাথে মিলে যাবে, এটি রেজিগ্রারে দেখুন


1
আমি রেজেক্সপাল জানি না, তবে রেজিেক্সগুলি সমস্ত ভাষায় পৃথক এবং বর্ণনাকারী অনুসারে একটি উন্নত বৈশিষ্ট্য যা সকলের দ্বারা সমর্থিত নয়।
স্টিমা

7
রিজেক্সপাল একটি জাভাস্ক্রিপ্ট ভিত্তিক রেইগেক্স পরীক্ষক এবং জাভাস্ক্রিপ্ট দাবীদারদের পিছনে থাকা দাবী সমর্থন করে না যা দুঃখজনক
হামজা 6:56

রিজেক্সার (জাভাস্ক্রিপ্ট) -এ লুকব্যান্ডগুলি সমর্থিত নয়
স্টিলথ রাব্বি

1
জেএসে লুকবিহিন্ডের অভাব আমাকে কাঁদিয়ে তোলে। আপনি যদি সার্ভার-সাইড করছেন তবে আপনি সম্ভবত এনপিএমের পিসিআরই মডিউলটি ব্যবহার করতে পারেন বা সরাসরি ব্যবহার করার জন্য এটি ব্যবহার করতে পারেন (এটি বাইন্ডিংয়ের একটি সেট তাই আমি মনে করি না আপনি এটি সামনের দিকে ব্যবহার করতে পারেন)
এরিক বার্কল্যান্ড

Lookahead / lookbehind গবেষকেরা আরো প্রকারসমূহ: stackoverflow.com/q/2973436/12484
জন স্নাইডার

76

না ব্যবহার করুন (^ ) প্রতীক:

.*[^a]$

যদি আপনি রাখেন ^ বন্ধনীর শুরুতে প্রতীকটি রাখেন তবে এর অর্থ "বন্ধনীগুলির জিনিসগুলি বাদে সমস্ত কিছুই।" $কেবল শেষ প্রান্তে একটি অ্যাঙ্কর।

একাধিক অক্ষরের জন্য কেবল তাদের সমস্তকে তাদের নিজস্ব চরিত্রের সেটে রাখুন:

.*[^a][^b]$

1
+1, সতর্কতার সাথে যে এটি খালি স্ট্রিংয়ের সাথে মেলে না (যা উদ্দেশ্য হিসাবে হতে পারে বা নাও পারে), সুতরাং এর অর্থটি বরং "কোনও অক্ষর যা বন্ধনীতে নেই" is
ফ্রেড ফু

3
@ 0A0D: সাদা স্পেসযুক্ত একটি স্ট্রিং খালি স্ট্রিং নয়।
ফ্রেড ফু

7
@ 0 এ0 ডি আসলে, এটি বিতর্কের পক্ষে নেই, এটি একটি সত্য
tckmn

8
@ ডুরকনব: এটি মেলে না aeবা cb
ফ্রেড ফু

1
না, এটি "এসিবি" কেও অনুমতি দেয় না।
মেন্নো

49

".Tmp" দিয়ে শেষ না হওয়া ফাইলগুলির সন্ধানের জন্য আমরা নীচের রেজেক্স ব্যবহার করি:

^(?!.*[.]tmp$).*$

রেজেক্স টেস্টার দ্বারা পরীক্ষিত নিম্নলিখিত ফলাফল দেয়:

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


1
এটি আকর্ষণীয়, কোনও ধারণা কেন এটি কাজ করে এবং কেন কাজ ^.*(?![.]tmp$)করে না?
asukasz জারোদা

4
আপনার প্রারম্ভিক .*ইতিমধ্যে পুরো স্ট্রিংয়ের সাথে মেলে, তাই বাকি বর্জনটি আর কাজ করে না।
ফাইভ ও

আমার উদ্দেশ্যে, এটি কাজ করেছে এবং অন্যান্য উত্তরগুলি তা করেনি। ধন্যবাদ!
ডেভিড

8
.*[^a]$

উপরের রেজেক্স স্ট্রিংগুলির সাথে মিলবে যা শেষ হচ্ছে না a


আমি আমার প্রশ্নটি প্রসারিত করেছি যেহেতু মূল উদাহরণটি আমার ক্ষেত্রে পুরোপুরি মেলে না। আপনি কি এটি সমাধান করতে পারেন?
মেন্নো

5

এটা চেষ্টা কর

/.*[^a]$/

[]একটি অক্ষর বর্গ উল্লেখ করে, এবং ^inverts চরিত্র শ্রেণী সবকিছু কিন্তু একটি মেলে a


1

প্রশ্নটি পুরানো তবে আমি এখানে পোস্ট করার মতো আরও ভাল সমাধান খুঁজে পেলাম না। সমস্ত ইউএসবি ড্রাইভ সন্ধান করুন তবে পার্টিশনগুলি তালিকাভুক্ত করবেন না , ফলস্বরূপ "অংশ [0-9]" সরিয়ে ফেলুন। আমি দুটি গ্রেপ করে শেষ করেছি, শেষটি ফলাফলটিকে উপেক্ষা করে:

ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -vE "part[0-9]*$"

এটি আমার সিস্টেমে ফলাফল:

pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0

আমি যদি কেবল পার্টিশন চাই তবে আমি করতে পারি:

ls -1 /dev/disk/by-path/* | grep -P "\-usb\-" | grep -E "part[0-9]*$"

আমি যেখানে পেয়েছি:

pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part1
pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0-part2

এবং আমি যখন করি:

readlink -f /dev/disk/by-path/pci-0000:00:0b.0-usb-0:1:1.0-scsi-0:0:0:0

আমি পাই:

/dev/sdb

1

যদি আপনি চেহারাটি ব্যবহার করতে পারেন তবে গৃহীত উত্তরটি ঠিক আছে। তবে এই সমস্যাটি সমাধান করার জন্য আরও একটি পদ্ধতি রয়েছে।

আমরা যদি এই প্রশ্নের জন্য বিস্তৃত প্রস্তাবিত রেজেক্সটি দেখি:

.*[^a]$

আমরা দেখতে পাবো যে এটি প্রায় কাজ করে। এটি কোনও খালি স্ট্রিং গ্রহণ করে না, যা কিছুটা অসুবিধেয় হতে পারে। তবে, কেবল একটি চরিত্রের সাথে ডিল করার সময় এটি একটি ছোটখাটো সমস্যা। তবে, আমরা যদি পুরো স্ট্রিং বাদ দিতে চাই, যেমন "abc", তবে:

.*[^a][^b][^c]$

করবে না উদাহরণস্বরূপ এটি এসি গ্রহণ করবে না।

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

.{,2}$|.*[^a][^b][^c]$

বা আরও সাধারণ সংস্করণ:

.{,n-1}$|.*[^firstchar][^secondchar]$ স্ট্রিং তোমাদেরকে নিষেধ (জন্য চান দৈর্ঘ্য যেখানে n হল abcএটা 3 এর) এবং firstchar, secondchar... প্রথম, আপনার স্ট্রিং এর দ্বিতীয় ... n তম অক্ষর (জন্য abcএটি হবে a, তারপর b, তারপর c)।

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

এখানে অনুসন্ধানের উদাহরণ রয়েছে যা .jpg নয় এমন সমস্ত ফাইল মুছে ফেলবে:

find . -regex '.{,3}$|.*[^.][^j][^p][^g]$' -delete


.{,2}$|.*[^a][^b][^c]$মিলছে নাccc
psalaets

0

যে কোনও .*a$কিছুর সাথে শেষ হওয়া কোনও কিছুর সাথে --- তাই আপনি যখন রেজিক্সের সাথে মেলে তখন শর্তটি উপেক্ষা করুন বা বিকল্পভাবে আপনি সেখানেও করতে পারেন .*[^a]$যেখানে [^a]কিছু বোঝায়not a


0

আপনি যদি ব্যবহার করছেন grepবা sedসিনট্যাক্সটি কিছুটা আলাদা হবে। লক্ষ করুন যে অনুক্রমিক [^a][^b]পদ্ধতিটি এখানে কাজ করে না:

balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n'
jd8a
8$fb
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a]$"
8$fb
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b]$"
jd8a
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^c]$"
jd8a
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a][^b]$"
jd8a
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a][^c]$"
jd8a
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a^b]$"
q(c
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^a^c]$"
8$fb
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b^c]$"
jd8a
balter@spectre3:~$ printf 'jd8a\n8$fb\nq(c\n' | grep ".*[^b^c^a]$"

এফডাব্লুআইডাব্লু , আমি রেজিএক্স 101-তে একই ফলাফল খুঁজে পাচ্ছি যা আমি মনে করি জাভাস্ক্রিপ্ট সিনট্যাক্স।

খারাপ: https://regex101.com/r/MJGAmX/2
ভাল: https://regex101.com/r/LzrIBu/2

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