জাভা, ge এর বনাম \\ এস + এ রেগেক্স এক্সপ্রেশন


উত্তর:


89

প্রথমটি একটি একক সাদা স্থানের সাথে মেলে, অন্যদিকে এক বা একাধিক শ্বেতস্পেসের সাথে মেলে। তারা তথাকথিত নিয়মিত এক্সপ্রেশন কোয়ান্টিফায়ার এবং তারা এই জাতীয় ম্যাচগুলি সম্পাদন করে ( ডকুমেন্টেশন থেকে নেওয়া ):

Greedy quantifiers
X?  X, once or not at all
X*  X, zero or more times
X+  X, one or more times
X{n}    X, exactly n times
X{n,}   X, at least n times
X{n,m}  X, at least n but not more than m times

Reluctant quantifiers
X?? X, once or not at all
X*? X, zero or more times
X+? X, one or more times
X{n}?   X, exactly n times
X{n,}?  X, at least n times
X{n,m}? X, at least n but not more than m times

Possessive quantifiers
X?+ X, once or not at all
X*+ X, zero or more times
X++ X, one or more times
X{n}+   X, exactly n times
X{n,}+  X, at least n times
X{n,m}+ X, at least n but not more than m times

21
আমি সর্বদা ভালবাসি যে তারা কীভাবে প্রতিটি কোয়ান্টিফায়ারের লোভী, অনিচ্ছুক এবং অধিকারী সংস্করণগুলির আলাদা বিবরণ সরবরাহ করে এবং তারপরে তিনটি সম্পর্কে ঠিক একই কথা বলে। ;)
অ্যালান মুর

60

এই দুটি replaceAllকল সর্বদা একই ফলাফল উত্পন্ন করবে, যা তা বিবেচনা না করেই x। যাইহোক, এটি লক্ষ্য করা গুরুত্বপূর্ণ যে নিয়মিত দুটি এক্সপ্রেশন একই নয়:

  • \\s - একক সাদা স্থানের অক্ষরের সাথে মেলে
  • \\s+ - এক বা একাধিক সাদা স্থানের অক্ষরের ক্রম মেলে।

এই ক্ষেত্রে, এতে কোনও পার্থক্য নেই, যেহেতু আপনি সমস্ত কিছু খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করছেন (যদিও \\s+দক্ষতার দৃষ্টিকোণ থেকে এটি ব্যবহার করা ভাল )। আপনি যদি খালি খালি স্ট্রিংয়ের সাথে প্রতিস্থাপন করছিলেন তবে দু'জন আলাদা আচরণ করবে।


আপনার প্রথম লাইনটি লিখুন, যদি x হয় "আপনার ডোমেন বুক করুন এবং Today n \ n \ n \ n \ n \ n অনলাইন টুডে দিন।" দু'জনেই কি একই ফলাফল আনবে?
সফট 1

4
@ ব্যবহারকারী3705478 উভয়ই একই ফলাফল তৈরি করবে, এমনকি একে অপরের পরে একাধিক স্পেস থাকলেও। পার্থক্যটি যেভাবে পরিচালনা করা হয় তার মধ্যে রয়েছে। যদি আপনার একটি গ্রুপ থাকে (উদাহরণস্বরূপ) 3 স্পেস সরাসরি একে অপরকে অনুসরণ করে + সেই গোষ্ঠীটি নেয় এবং পুরোটিকে এটিকে "" রূপান্তরিত করে, অন্যদিকে every গুলি প্রতিটি স্থান নিজেরাই প্রক্রিয়া করে।
ডেনি

11

প্রথমে আপনার বুঝতে হবে যে উভয় স্টেটমেন্টের চূড়ান্ত আউটপুট একই হবে অর্থাত্ স্ট্রিং থেকে সমস্ত স্পেস সরিয়ে ফেলতে।

তবে x.replaceAll("\\s+", "");স্পেস ট্রিমিংয়ের আরও কার্যকর উপায় হবে (যদি স্ট্রিংয়ের একাধিক স্বতন্ত্র স্থান থাকতে পারে) কারণ সম্ভবত রিজেক্স \\s+1 বা তার বেশি স্পেস একসাথে মিলে যায় এবং খালি স্ট্রিংয়ের সাথে তাদের প্রতিস্থাপন করে replace

সুতরাং আপনি উভয় থেকে একই আউটপুট পান যদিও এটি ব্যবহার করা ভাল:

x.replaceAll("\\s+", "");

2

প্রথম রেজেক্স একটির সাদা বর্ণের অক্ষরের সাথে মিলবে। দ্বিতীয় রেজেক্স অনিচ্ছাকৃতভাবে এক বা একাধিক সাদা বর্ণের অক্ষরের সাথে মিলবে। বেশিরভাগ উদ্দেশ্যে, এই দুটি রেজেক্সস খুব একই রকম, দ্বিতীয় ক্ষেত্রে বাদে, রেজেক্স আরও স্ট্রিংয়ের সাথে মেলে, যদি এটি রেজেক্স ম্যাচটি ব্যর্থ হতে বাধা দেয়। http://www.coderanch.com/t/570917/java/java/regex-differences থেকে


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