জাভা রেজিএক্স মেটা চরিত্র (।) এবং সাধারণ বিন্দু?


150

জাভা রেজেক্সে, .কোনও বাক্যে আমরা যেমন ব্যবহার করি তেমনি মেটা অক্ষর এবং সাধারণ বিন্দুর মধ্যে পার্থক্য কীভাবে খুঁজে পাওয়া যায় । কিভাবে খুব মত অন্যান্য মেটা অক্ষরের জন্য অবস্থা এই ধরনের হ্যান্ডেল করতে ( *, +, \d, ...)

উত্তর:


276

আপনি যদি রেজেক্সের কোনও বিশেষ অর্থযুক্ত বিন্দু বা অন্যান্য অক্ষরগুলি একটি সাধারণ চরিত্র হতে চান, আপনাকে ব্যাকস্ল্যাশ দিয়ে এড়িয়ে যেতে হবে। যেহেতু জাভাতে রেজিক্সগুলি সাধারণ জাভা স্ট্রিং, আপনাকে নিজেই ব্যাকস্ল্যাশ থেকে বাঁচতে হবে, সুতরাং আপনার দুটি ব্যাকস্ল্যাশ প্রয়োজন যেমন\\.


1
এই ফিক্স ব্যাশ
ক্রিভর

18
জেনে থাকুন যে ব্যাকস্ল্যাশ থেকে বাঁচতে হবে তা নির্ভর করে আপনি কীভাবে রেজেনেক্স সরবরাহ করছেন তার উপর। হার্ডকোড থাকলে আপনার ব্যবহারের প্রয়োজন: "\\" \\ , যদি কোনও কাঁচা উত্স (যেমন পাঠ্য ফাইল) থেকে পড়া হয় তবে আপনি কেবলমাত্র একক ব্যাকস্ল্যাশ ব্যবহার করেন: \ \
পল

25

অন্যান্য সদস্যদের প্রস্তাবিত সমাধানগুলি আমার পক্ষে কাজ করে না।

তবে আমি এটি পেয়েছি:

জাভা regexp লেখায় একটি বিন্দু থেকে বাঁচতে [.]


2
একি, \\.আমার জন্য কাজ করে নি: \.অভিযোগ করেন যে .পলান করা প্রয়োজন নয়, \\.তৈরি তা চিন্তা এটি ছিল \.পরিবর্তে ., \\\.এবং একটি ত্রুটি ছুড়ে ফেলে রচয়িতা, [.]শুধু কাজ ছিল।
মিঠুনক

1
@ মিঠুনক এটি অদ্ভুত, \\.একটি স্ট্রিং আক্ষরিক ভিতরে আপনাকে দেয় \.যা রেজেক্সকে বিন্দুটিকে কোনও অক্ষরের ম্যাচের পরিবর্তে আক্ষরিক বিন্দু হিসাবে দেখতে হবে।
klaar

16

পার্ল-স্টাইলের নিয়মিত এক্সপ্রেশন (যা জাভা রেজেক্স ইঞ্জিনটি কমবেশি ভিত্তিতে থাকে) নিম্নলিখিত অক্ষরগুলিকে বিশেষ অক্ষর হিসাবে বিবেচনা করে:

.^$|*+?()[{\চরিত্র শ্রেণীর বাইরে বিশেষ অর্থ রয়েছে ,

]^-\অক্ষর শ্রেণীর ভিতরে বিশেষ অর্থ ( [...]) রয়েছে।

সুতরাং আপনাকে প্রসঙ্গের উপর নির্ভর করে সেই (এবং কেবলমাত্র সেগুলি) প্রতীকগুলি এড়াতে হবে (বা, চরিত্রের শ্রেণীর ক্ষেত্রে, তাদের এমন অবস্থানে রাখুন যেখানে তাদের ভুল ব্যাখ্যা করা যায় না)।

অপ্রয়োজনীয়ভাবে অন্যান্য অক্ষরগুলি থেকে পালানো কাজ করতে পারে তবে কিছু রেজেক্স ইঞ্জিন এটিকে সিনট্যাক্স ত্রুটি হিসাবে বিবেচনা করবে, উদাহরণস্বরূপ \_.NET এ ত্রুটির কারণ ঘটবে।

কিছু অন্যান্য মিথ্যা ফলাফলের দিকে পরিচালিত করবে, উদাহরণস্বরূপ পার্লকে \<আক্ষরিক হিসাবে ব্যাখ্যা করা হয়েছে <, তবে এর egrepঅর্থ "শব্দের সীমানা"।

লেখার তাই -?\d+\.\d+\$ম্যাচে 1.50$, -2.00$ইত্যাদি এবং [(){}[\]]একটি অক্ষর বর্গ যে বন্ধনী / ধনুর্বন্ধনী / প্রথম বন্ধনী সব ধরণের সাথে মেলে জন্য।

আপনার যদি কোনও ইউজার ইনপুট স্ট্রিংকে একটি রেজেক্স-নিরাপদ ফর্ম রূপান্তর করতে হয়, ব্যবহার করুন java.util.regex.Pattern.quote

আরও পড়ুন: মেটাচার্যাকরদের থেকে পালানোর বিষয়ে জান গোয়েভার্টের ব্লগ রেগেক্সগুরু


4

একটি ব্যাকস্ল্যাশ দিয়ে বিশেষ অক্ষরগুলি এড়িয়ে চলুন। \., \*, \+, \\d, এবং তাই। আপনি যদি অনিশ্চিত হন তবে আপনি কোনও বর্ণমালার অক্ষরটি বিশেষ কিনা সেগুলি থেকে পালাতে পারেন। আরও তথ্যের জন্য java.util.regex.Pattern এর জাভাডোক দেখুন ।


অ-বিশেষ অক্ষরগুলি অকারণে পালিয়ে যাওয়া কিছু ভাষায় কাজ করতে পারে তবে অন্যের মধ্যে এটি ব্যর্থ হতে পারে, তাই অভ্যাসে না আসাই ভাল।
টিম পিটজ্যাকার

1
এই প্রশ্নটি যদিও জাভা সম্পর্কে বিশেষত, এবং ডকস.অরাকল.com/ জাভ্যাস / //docs/api/java/util/regex/… বলছে "একটি অক্ষর অক্ষরের পূর্বে একটি ব্যাকস্ল্যাশ ব্যবহার করা যেতে পারে সে বর্ণ নির্বিশেষে একটি অপরিশোধিত নির্মাণের অংশ "
ক্রিস্টোফার হামারস্ট্রিম

2

এখানে কোড আপনি সরাসরি পেস্ট অনুলিপি করতে পারেন:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

এবং যদি ভুলক্রমে "এর আগে বা পরে ফাঁকা জায়গা থাকে তবে কি হবে"। এই ক্ষেত্রে? এই স্থানগুলিকেও বিবেচনা করা সর্বদা সেরা অনুশীলন।

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

এখানে, স্থানগুলি বিবেচনা করতে এবং আপনাকে কেবল প্রয়োজনীয় বিভক্ত স্ট্রিংগুলি দেওয়ার জন্য \\ গুলি * রয়েছে।


1

আমি "। *" দিয়ে শেষ হওয়া একটি স্ট্রিংয়ের সাথে মিল রাখতে চেয়েছিলাম এর জন্য আমাকে নিম্নলিখিতগুলি ব্যবহার করতে হয়েছিল:

"^.*\\.\\*$"

কিন্ডা নির্বোধ যদি আপনি এটি সম্পর্কে চিন্তা করেন: ডি হেরেস এর অর্থ কী। স্ট্রিংয়ের শুরুতে বিন্দুর পরে কোনও অক্ষর শূন্য বা তার বেশি বার হতে পারে ""। স্ট্রিংয়ের শেষে একটি তারা (*) অনুসরণ করবে।

আমি আশা করি এটি কারও কাজে আসবে। ফ্যাবিয়ানকে ব্যাকস্ল্যাশ জিনিসটির জন্য ধন্যবাদ।


ঠিক "\\.\\*$"তখনই ব্যবহার করুন । স্ট্রিংটির শুরুর জন্য কোনও মিলের প্রয়োজন নেই যদি এটি আপনার পক্ষে গুরুত্বপূর্ণ না।
ওপিডিয়ান

হ্যাঁ আপনি সঠিক. সত্যি কথা বলতে, আমি এর জন্য ব্যবহারের
কেসটি

সত্যিই আপনাকে সাহায্য করার জন্য নয় অন্যদের আপনার পোস্টটি দেখার জন্য সহায়তা করার জন্য ছিল: পি
ওপিডিয়ান

0

আপনি যদি আপনার বাক্যটি "। " দিয়ে শেষ হয় কিনা তা পরীক্ষা করে দেখতে চান তবে আপনাকে আপনার প্যাটার্নের শেষে [\। \ ] $ যুক্ত করতে হবে।


0

আমি জেগ্রাসে কিছু বেসিক অ্যারে করছি এবং এটি দেখতে পেয়েছি যে একটি চতুর [] [] অ্যারে ব্যবহার করার জন্য ('।') একটি বিন্দু রাখার জন্য একটি অ্যাক্সেসর পদ্ধতি রয়েছে।

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