প্রথম ম্যাচে থামার জন্য নিয়মিত প্রকাশ


528

আমার রেজেক্স প্যাটার্নটি দেখতে এমন কিছু দেখাচ্ছে

<xxxx location="file path/level1/level2" xxxx some="xxx">

আমি কেবল অবস্থানের জন্য বরাদ্দকৃত অংশের অংশে আগ্রহী। লোভী সুইচ ছাড়া এটি কি নীচের মতো সহজ হওয়া উচিত নয়?

/.*location="(.*)".*/

কাজ বলে মনে হচ্ছে না।


আপনার উত্সটি কী, এটি কি এইচটিএমএল বা এক্সএমএল বা কিছু?
ওসকার কেজলিন

20
কেন এটি একটি সম্প্রদায়ের উইকি? এটি একটি আসল প্রশ্ন। খুব দেরি হয়ে গেছে এখন.
আহমাদ মার্জ

1
আপনি কোন ভাষায় লিখছেন? দয়া করে এক্সএমএল এর জন্য রেজেেক্স ব্যবহার করবেন না। এক্সএমএলকে পার্স করার আরও অনেক ভাল উপায় রয়েছে
ওসকার কেজলিন ২৩'১০

3
আপনি চাইলে সমস্ত সাধারণ বৈশিষ্ট্যের জন্য স্ক্যান করা হয় না। Regex উপযুক্ত এবং দ্রুত।
কোডেনহেম

আমি বলব যে আপনি উদাহরণস্বরূপ কোড সি # যদি এর জন্য লিনক ব্যবহার করা অনেক ভাল। আমি সন্দেহ করি আপনার কাছে যদি পার্সার ভাল থাকে তবে
রেজেক্সট করা

উত্তর:


1092

আপনাকে আপনার নিয়মিত প্রকাশকে লোভী করা দরকার, কারণ ডিফল্টরূপে, সমস্তটির সাথে "(.*)"মিলবে "file path/level1/level2" xxx some="xxx"

পরিবর্তে আপনি আপনার ডট-স্টারকে অ-লোভী করতে পারেন, এটি এটি যতটা সম্ভব অক্ষরের সাথে মিলিয়ে তুলবে:

/location="(.*?)"/

একটি যোগ করার পদ্ধতি ?একটি কোয়ান্টিফায়ার (চালু ?, *অথবা +) এটিকে অ লোভী করে তোলে।


32
এফডব্লিউআইডাব্লু, আপনার ভিআইএম ব্যবহার করে, এই রেজেক্সটি কিছুটা আলাদা হওয়া দরকার: এর পরিবর্তে .*?এটি .\{-}কোনও লোভী ম্যাচের জন্য নয়।
SooDesuNe

44
ধন্যবাদ ড্যানিয়েল "কোয়ান্টিফায়ার (?, * বা +) এ একটি যুক্ত করা এটিকে লোভী করে তোলে?" আমার জন্য সহায়ক টিপ।
ফ্যাটএইচভি

10
দ্য ? এটি বের করার চেষ্টা করতে আমার বিভ্রান্তি বর্ণনা করে। কতটা উপযুক্ত।
রবি স্মিথ

1
আমি বিশ্বাস করি আপনি 'অ-লোভী' পরিবর্তে 'অলস' বলতে পারবেন
মান্টিকোর

50

location="(.*)""পরের পরে" location=অবধি মিলিত হবে যতক্ষণ some="xxxনা আপনি এটিকে লোভী করেন। সুতরাং আপনার হয় হয় .*?(অর্থাত্ এটি লোভী করা) বা এর সাথে আরও ভাল প্রতিস্থাপন .*করা উচিত [^"]*


3
[^ "] * বেশিরভাগ রেইজেক্স ইঞ্জিনগুলির সাথে সম্ভবত দ্রুততর কারণ এটি বর্তমান প্যাটার্নের পরে প্যাটার্নটি দেখার দরকার নেই
জিন ভিনসেন্ট

1
@ কিপ: আপনি সম্ভবত সঠিক, তবে .*?স্বরলিপিটি তুলনায় বেশি সাধারণ[^"]*
বন্ডাক্স

আমি যদি [^ "] * ব্যবহার করে ডিলিমিটারের চরিত্রটি অন্তর্ভুক্ত করতে চাই তবে কী হবে
ফরোহলিচ

মোটেও না, যদি আপনি না জানেন তবে ^ এবং [] এখানে কী বোঝায়। বেশিরভাগ লোকেরা বুঝতে পারবেন * *
ভিনসেন্ট গেরিস

31

কেমন

.*location="([^"]*)".*

এটি সীমাহীন অনুসন্ধানের সাথে * এড়ায় * * এবং প্রথম উদ্ধৃতিতে ঠিক মিলবে।


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

22

আপনার ইঞ্জিন যদি এটি সমর্থন করে তবে অ-লোভী মিলটি ব্যবহার করুন। যুক্ত করুন ? ক্যাপচার ভিতরে।

/location="(.*?)"/

11

?কোনও বৈশ্বিক পতাকাবিহীন অলস কোয়ান্টিফায়ার ব্যবহার উত্তর।

যেমন,

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

আপনার যদি /gতখন বিশ্ব পতাকা থাকে তবে এটি নীচের মতো সর্বনিম্নতম দৈর্ঘ্যের ম্যাচগুলির সাথে মিলে। এখানে চিত্র বর্ণনা লিখুন


1

কারণ আপনি পরিমাণযুক্ত সাবপ্যাটার্ন ব্যবহার করছেন এবং পার্ল ডকের বর্ণিত হিসাবে ,

ডিফল্টরূপে, একটি সংখ্যায় subpattern "হয় লোভী ", যে, এটি হিসাবে ম্যাচ হবে অনেক বার যতটা সম্ভব (একটি নির্দিষ্ট শুরুর অবস্থান দেওয়া হয়) এখনও প্যাটার্ন মেলে বাকি অনুমতি দেয়। আপনি যদি এটির সর্বনিম্ন সংখ্যার সাথে সামঞ্জস্য করতে চান তবে কোয়ান্টিফায়ারটিকে একটি "?" দিয়ে অনুসরণ করুন ? । মনে রাখবেন যে অর্থগুলি পরিবর্তিত হয় না, কেবল "লোভ":

*?        //Match 0 or more times, not greedily (minimum matches)
+?        //Match 1 or more times, not greedily

সুতরাং, আপনার পরিমাণযুক্ত প্যাটার্নটিকে ন্যূনতম মিল তৈরি করতে অনুমতি দেওয়ার জন্য এটি অনুসরণ করুন ?:

/location="(.*?)"/

1

এখানে অন্য উপায়।

আপনি চান এটি এখানে। এই অলস[\s\S]*?

প্রথম আইটেম: এর সাথে [\s\S]*?(?:location="[^"]*")[\s\S]* প্রতিস্থাপন করুন:$1

ব্যাখ্যা : https://regex101.com/r/ZcqcUm/2


সম্পূর্ণতার জন্য, এটি শেষটি পায়। এটা লোভী[\s\S]*

শেষ আইটেম: এর সাথে[\s\S]*(?:location="([^"]*)")[\s\S]* প্রতিস্থাপন:$1

ব্যাখ্যা : https://regex101.com/r/LXSPDp/3


এই দুটি নিয়মিত প্রকাশের মধ্যে কেবলমাত্র 1 টি পার্থক্য রয়েছে এবং এটি হ'ল ?

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