একটি স্ট্রিং থেকে বিশেষ অক্ষরগুলি কীভাবে সরাবেন?


90

আমি বিশেষ অক্ষরগুলি মুছতে চাই:

- + ^ . : ,

জাভা ব্যবহার করে একটি স্ট্রিং থেকে।


আপনি কীভাবে আপনার প্রশ্ন ট্যাগ করেছেন তার উপর ভিত্তি করে একটি রেজেক্স কী তা আপনি স্পষ্টতই ইতিমধ্যে জানেন। আপনি কি Stringক্লাসের জন্য ডকুমেন্টেশন পড়ার চেষ্টা করেছিলেন ? বিশেষত, 'রেজেক্স' শব্দটির সন্ধান করুন; কয়েকটি পদ্ধতি রয়েছে, এবং কিছুটা চিন্তাভাবনা আপনাকে কীভাবে এগিয়ে যেতে হবে তা বলা উচিত ... :)
কার্ল ন্যাচেল

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

4
এগুলি বিশেষ অক্ষর নয় ... এগুলি হ'ল: äâêíìéè যেহেতু এগুলি আপনার সাধারণ 1-বাইট চরিত্রের ধরণের নয় - যেমন + + Ray রাই যেমন বলেছে, হয় replaceAllতাদের জন্য কিছু করুন, বা একটি বিশ্লেষণ করুন স্ট্রিং, এমন অক্ষর যুক্ত করুন যা আপনি অন্য স্ট্রিংয়ের সাথে বের করতে চান এমন অক্ষরগুলি যোগ করুন এবং শেষে আপনি যে স্ট্রিংটি ফিরে আসবেন তার জন্য কেবলমাত্র একটি + = করুন।
গোনালো ভিয়েরা

উত্তর:


255

এটি বিশেষ চরিত্র হিসাবে আপনি কী সংজ্ঞা দেন তার উপর নির্ভর করে তবে চেষ্টা করুন replaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

নোট করুন যে ^অক্ষরটি অবশ্যই তালিকার প্রথমটি হওয়া উচিত নয়, যেহেতু আপনাকে তখন এড়িয়ে যেতে হবে অথবা এর অর্থ "এই অক্ষরগুলি ব্যতীত অন্য কোনও" হবে।

আরেকটি নোট: -চরিত্র অন্যথায় আপনি এটি অব্যাহতি আছে চাই বা এটি একটি পরিসর নির্ধারণ করবে (যেমন তালিকায় প্রথম অথবা শেষ এক হতে প্রয়োজন, :-,"সীমার মধ্যে সমস্ত অক্ষর মানে হবে :থেকে ,)।

সুতরাং, অর্ডার দৃঢ়তা রাখতে এবং চরিত্র পজিশনিং উপর নির্ভর করে, আপনি সমস্ত অক্ষর আছে যা রেগুলার এক্সপ্রেশনের একটি বিশেষ অর্থ আছে অব্যাহতি চাইতে পারেন (নিম্নলিখিত তালিকা সম্পূর্ণ নয়, তাই অন্যান্য অক্ষরের সচেতন হতে হয় পছন্দ (, {, $ ইত্যাদি) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


আপনি যদি সমস্ত বিরামচিহ্ন এবং চিহ্নগুলি থেকে মুক্তি পেতে চান তবে এই রেজেক্সটি ব্যবহার করে দেখুন: \p{P}\p{S}(মনে রাখবেন যে জাভা স্ট্রিংগুলিতে আপনাকে পিছনে পিছনে যেতে হবে "\\p{P}\\p{S}") s

তৃতীয় উপায়টি এর মতো কিছু হতে পারে, আপনি যদি আপনার স্ট্রিংয়ের মধ্যে কী ছেড়ে দিতে হবে তা সঠিকভাবে নির্ধারণ করতে পারেন:

String  result = yourString.replaceAll("[^\\w\\s]","");

এর অর্থ: শব্দের অক্ষর নয় এমন সব কিছু প্রতিস্থাপন করুন (যে কোনও ক্ষেত্রে এজেড, 0-9 বা _) বা সাদা স্থান।

সম্পাদনা করুন: দয়া করে নোট করুন যে এখানে আরও কয়েকটি ধাঁচ রয়েছে যা সহায়ক হিসাবে প্রমাণিত হতে পারে। যাইহোক, আমি তাদের সমস্ত ব্যাখ্যা করতে পারছি না, তাই নিয়মিত- এক্সপ্রেসন.ইনফো এর রেফারেন্স বিভাগটি দেখুন ।

রায়ের পরামর্শ অনুসারে এখানে "অনুমোদিত অক্ষরগুলি সংজ্ঞায়িত করুন" পদ্ধতির কম সীমাবদ্ধ বিকল্প রয়েছে:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

রেজেক্স এমন কোনও কিছুর সাথে মেলে যা কোনও ভাষার অক্ষর নয় এবং বিভাজক নয় (হোয়াইটস্পেস, লাইনব্রেক ইত্যাদি)। নোট করুন যে আপনি ব্যবহার করতে পারবেন না [\P{L}\P{Z}](আপার কেস পি এর অর্থ সেই সম্পত্তি না থাকা), যেহেতু এর অর্থ "সমস্ত কিছুই যা চিঠি নয় বা হোয়াইটস্পেস নয়", যা প্রায় সমস্ত কিছুর সাথে মেলে, যেহেতু অক্ষরগুলি শ্বেত স্পেস এবং বিপরীত নয়।

ইউনিকোডের অতিরিক্ত তথ্য

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


সেরা সাধারণ-উদ্দেশ্য সমাধানের জন্য +1। যেহেতু আপনি ওপি থেকে বিশদ অবলম্বনে কয়েকটি বৈকল্পিক তালিকাবদ্ধ করছেন, আপনি পাশাপাশি প্যাটার্নগুলি প্রদর্শন এবং ব্যাখ্যা করতে পারেন[\P{L}]
রায় তোয়াল

এছাড়াও নোট করুন যে -চরিত্রটি অবশ্যই তালিকার প্রথম বা শেষ একটি হতে হবে বা এড়াতে হবে।
কেপেক্স

[^\\p{L}\\p{Z}]জার্মান উমলৌতকে (ä, ö, ü) পাশাপাশি মুছে ফেলা বলে মনে হচ্ছে (কমপক্ষে এটি আমার জন্য এটি করে: /), সুতরাং "রেজেক্সগুলি কোনও ভাষার কোনও অক্ষর নয় এমন সমস্ত কিছুের সাথে মেলে" 100% সঠিক বলে মনে হচ্ছে না
পিটার

@ পিটার এটি আমার পরীক্ষায় এই অক্ষরগুলি মুছে দেয় না। আপনার ক্ষেত্রে অন্য সমস্যা হতে পারে, যেমন পাঠ্যের আলাদা এনকোডিং। আমি আরও তথ্যের একটি লিঙ্ক যুক্ত করব।
টমাস

4
@Thomas String result = yourString.replaceAll("[^\w\s]","");ত্রুটি তোলেInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth


18

হিসাবে এখানে বর্ণিত http://developer.android.com/reference/java/util/regex/Pattern.html

প্যাটার্নগুলি নিয়মিত এক্সপ্রেশন সংকলিত হয়। অনেক ক্ষেত্রে সুবিধাজনক পদ্ধতি যেমন String.matches, String.replaceAllএবং String.splitপছন্দনীয় হবে তবে যদি আপনাকে একই নিয়মিত অভিব্যক্তি দিয়ে অনেক কাজ করার প্রয়োজন হয় তবে এটি একবার সংকলন করে পুনরায় ব্যবহার করা আরও দক্ষ হতে পারে। প্যাটার্ন ক্লাস এবং এর সহযোগী ম্যাচার স্ট্রিংয়ের দ্বারা প্রকাশিত অল্প পরিমাণের চেয়ে বেশি কার্যকারিতা সরবরাহ করে।

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

ফলাফল

String is = one
Number is = 9196390097

এটি
আরবিক

15

ক্লাসের replaceAll()পদ্ধতি চেষ্টা করুন String

বিটিডাব্লু হ'ল পদ্ধতি, রিটার্নের ধরণ এবং পরামিতি।

public String replaceAll(String regex,
                         String replacement)

উদাহরণ:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

এটি যে সমস্ত '' ^ '', '+', '-' rs অক্ষর আপনি মুছে ফেলতে চেয়েছিলেন তা মুছে ফেলা উচিত!


6

বিশেষ অক্ষর অপসারণ করতে

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

আউটপুট হবে: abdd.

এটি পুরোপুরি কাজ করে।


4
আক্ষরিক স্ট্রিংয়ে অবৈধভাবে পালানোর চরিত্রটি পাবেন
জন জো

এটি স্পেসগুলি সরিয়ে ফেলবে যদি আপনি ফাঁকা রাখতে চান তবে t2 = t2.replaceAll ("[^ \\ w \\ s]", "") ব্যবহার করুন;
ইসুরু দিলশান


1

আপনি নিম্নলিখিত হিসাবে একক চর অপসারণ করতে পারেন:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

আউটপুট:

919595354336

0

আপনি যদি জাভাতে কেবল আক্ষরিক প্রতিস্থাপন করতে চান তবে Pattern.quote(string)কোনও স্ট্রিংকে একটি আক্ষরিক কাছে পালাতে ব্যবহার করুন ।

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