রেগেক্সের সাথে একটি লাইনে কেবল প্রথম উপস্থিতিটির মিল রয়েছে


42

আমি রেগেক্সে সম্পূর্ণ নতুন এবং আমি যে কোনও সাহায্যের প্রশংসা করব।

কাজটি সহজ। আমার কাছে এমন রেকর্ড সহ একটি সিএসভি ফাইল রয়েছে:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

আমি প্রথম কমাটি একটি স্থানের সাথে প্রতিস্থাপন করতে এবং প্রতিটি লাইনের জন্য বাকী কমাগুলি অক্ষত রেখে দিতে চাই। একটি রেজেক্স এক্সপ্রেশন আছে যা কেবল প্রথম কমাটির সাথে মেলে?

আমি এটি চেষ্টা করেছি : ^.....,. এটি কমাটির সাথে মেলে, তবে এটি কমাটির পূর্ববর্তী স্ট্রিংয়ের পুরো দৈর্ঘ্যের সাথেও মেলে, তাই আমি যদি একটি স্থান দিয়ে এটি প্রতিস্থাপন করার চেষ্টা করি তবে সমস্ত সংখ্যাও মুছে ফেলা হবে।


আপনি কোন সরঞ্জাম ব্যবহার করছেন? (সেড, পার্ল, অজানা, অন্য কিছু?)
মাদুর

টেক্সটপ্যাড (উইন্ডোজ)
গরু_ব্যাপি_হায়

উত্তর:


53

মিলের প্যাটার্নটি হতে পারে:

^([^,]+),

এর মানে

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

উদাহরণস্বরূপ পার্লের সাথে পুরো ম্যাচটি এবং প্রতিস্থাপনটি দেখতে পাবেন:

s/^([^,]+),/\1 /

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


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

7
s/,/ /

এটি, ডিফল্টরূপে (অর্থাত্ gবিকল্প ছাড়াই ) কেবল প্রথম ম্যাচটি প্রতিস্থাপন করে।


1
এটি কি আসলে টেক্সটপ্যাড অনুসন্ধান এবং সিনট্যাক্স প্রতিস্থাপন?
ড্যানিয়েল বেক

1
এই একটি বাক্য গঠন হয় sed, perlএবং কিছু অন্যান্য সরঞ্জাম।
pabouk

3

এটি কেবলমাত্র প্রথম সংখ্যা এবং কমা মেলে উচিত: ^(\d{5}),। আপনি যদি লাইনে থাকা সমস্ত কিছুর উপরে ঝাঁপিয়ে পড়তে চান তবে এটিকে পুনরায় পরিবর্তন করুন:^(\d{5}),(.*)$


এটিও কৌশলটি করেছিল। আমি প্রকৃতপক্ষে মাদুরের সমাধানটি ব্যবহার করে শেষ করেছি তবে আমি আপনার পরীক্ষাও করেছি এবং এটি কার্যকর। সাহায্যের জন্য ধন্যবাদ!
গরু_পরিচয়_হায়

কেন \d{5}এবং না [^,]*? এটি @ কমপক্ষে আরও জেনেরিক হবে।
জাস্টিনসিবি

2

আরও মার্জিত সমাধান হ'ল অলস মিলটি ব্যবহার করা:

s/^(.+?),/\1 /

যা প্রতিটি পদক্ষেপে স্ট্রিং ( ^) এর শেষে থেকে একটি অক্ষর ( .+?) দ্বারা সরানো না করে অক্ষরগুলিকে গোষ্ঠীভূত করবে ততক্ষণ এটি প্রথম কমা চিহ্ন সন্ধান করবে। প্রথম কমা ঘটনার সাথে এই সমস্ত গ্রুপটি গ্রুপ ( \1) এবং স্থানের অক্ষর দ্বারা প্রতিস্থাপিত হবে ।


দ্রষ্টব্য যে এটি এমন কোনও লাইনের সাথে মেলে না যেখানে কমা নেই (একটি লাইনের একক মান)। সমন্বয় কোনো * পারে এক ভাল চেয়ে +তাইs/^(.*?),/\1 /
জেফ Puckett

আপনি এটিও করতে পারেন s/^([^,]*),/\1 /, যা শুরুর সাথে মেলে, যা কমা নয়, পরে কমা। এছাড়াও, আপনি কি জানেন না যে s//এটি মেলে না এমন কোনও কিছু পরিবর্তন করে না?
জাস্টিনসিবি

1

টেক্সটপ্যাডে সর্বদা পোস্টিক্স স্বরলিপি ব্যবহার করার ক্ষমতা ছিল তবে আপনাকে অন্য একটি ডায়ালগ বাক্সে সেটিংস পরিবর্তন করতে হবে। নিয়মিত অভিব্যক্তিগুলির জন্য টেক্সটপ্যাডের ডিফল্ট সেটিংস ব্যবহার করতে আপনাকে খোলার এবং বন্ধ করার বন্ধনীগুলি "পালাতে" হবে:

প্রতিটি লাইনের শুরুতে, পাঁচ-অঙ্কের জিপ কোডের পরে স্থানটি প্রতিস্থাপন করুন

^\([0-9]+\)[ ]

ট্যাব সহ

\1\t

উপরে হিসাবে, ^ মানে লাইন শুরু

\ (এটি একটি "পালানো বন্ধনী" এবং এটি প্রথম অনুসন্ধানের অভিব্যক্তির অর্থাত্ পাঁচটি অঙ্কের সূচনা চিহ্নিত করে

[0-9] + এর অর্থ এক বা একাধিক সংখ্যা (কেবল 5-সংখ্যার জিপ কোডগুলি নয়)

\) প্রথম অনুসন্ধানের এক্সপ্রেশনটির শেষ চিহ্নিত করার জন্য আরেকটি "পালানো বন্ধনী"

[] হ'ল একটি স্থানের অক্ষর (আপনি বন্ধনীগুলি ছেড়ে দিতে পারেন, তবে তারপরে কেউ এই ওয়েব পৃষ্ঠায় এটি দেখতে সক্ষম হবেন না :-)

প্রতিস্থাপন অভিব্যক্তি

\ 1 হ'ল প্রথম অনুসন্ধানের অভিব্যক্তি, উপরের বন্ধনীগুলির মধ্যে অংশ (এক বা একাধিক সংখ্যা)

t একটি ট্যাব চরিত্র

সুতরাং অনুসন্ধান এবং প্রতিস্থাপন কমান্ডটি এক বা একাধিক অঙ্কের সন্ধান করবে এবং তারপরে একটি স্থান থাকবে। তারপরে এটি সমস্ত ট্যাব একই সংখ্যার গোষ্ঠীর সাথে প্রতিস্থাপন করে।

আমি মনে করি না যে "5 সংখ্যার পরে আসে এমন একটি স্থান" সন্ধানের কোনও উপায় আছে যাতে আপনি কেবল অঙ্কগুলি স্পর্শ না করে স্থানটি প্রতিস্থাপন করতে পারেন। যা শুরু করেছো এটি 5 টি সংখ্যা (প্রথম STRING) স্থান (দ্বিতীয় স্ট্রিং) দ্বারা অনুসরণ করে। তারপরে, এটি অনর্থক বা জটিল মনে হলেও, এটিএসএলএফের সাথে 5 সংখ্যার মূল স্ট্রিংটি অনুসরণ করুন, তারপরে ট্যাবটি (দ্বিতীয় স্ট্রিং) অনুসরণ করুন।

যে কেউ এটি জানেন তা ভুলে যায় যে নতুনদের সম্পর্কে এ সম্পর্কে কোনও ধারণা নেই। এই কারণেই আমি এটি আপনার জন্য বানান করছি, আমার বন্ধু।

এড পুর্ব ম্যাথ টিউটর এবং অবসরপ্রাপ্ত কম্পিউটার প্রোগ্রামার নিউ ইয়র্ক সিটি


0

যেকোন রেগেক্স এক্সপ্রেশনটির কেবল প্রথম ঘটনার সাথে মেলে সমস্ত পতাকা সরিয়ে ফেলুন। প্রতিটি রেজেক্স এক্সপ্রেশন নিম্নলিখিত সম্ভাব্য পতাকাগুলির সাথে আসে এবং সাধারণত বিশ্ব পতাকা ব্যবহার করে ডিফল্ট হয় যা একাধিক ঘটনার সাথে মিলবে:

  • / g = এই পতাকাটির সাথে অনুসন্ধানটি সমস্ত মিলের জন্য অনুসন্ধান করে, এটি ছাড়াই - কেবল প্রথম ম্যাচটিই ফিরে আসে
  • / i = কেস সংবেদনশীল
  • / মি = মাল্টি লাইন মোড
  • / গুলি = সব। নিউলাইন চরিত্রের সাথে মেলে। n
  • / u = ইউনিকোড
  • / y = স্টিকি মোড (নির্দিষ্ট জায়গায় সন্ধান করুন)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.