খালি স্ট্রিং সহ সমস্ত অ-অক্ষর অক্ষরকে প্রতিস্থাপন করা হচ্ছে


197

আমি এটি ব্যবহার করার চেষ্টা করেছি কিন্তু কার্যকর হয়নি -

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
ছেলেরা, আপনি ভুলে গেছেন যে ল্যাটিনটি বাদে অন্য বর্ণমালা রয়েছে।
মেটেভা

2
তবে আপনি উদাহরণ হিসাবে কোনও হোস্টনামটি বৈধ করতে চাইলে এটি অবৈধ বর্ণমালা বাদ দেওয়া ভাল lude
গার্নার্ড

উত্তর:


245

ব্যবহার [^A-Za-z0-9]

দ্রষ্টব্য: স্থানটি সরানো হয়েছে যেহেতু এটি সাধারণত অক্ষর হিসাবে বিবেচিত হয় না।


10
চরিত্র শ্রেণীর শেষে স্থানটি হওয়া উচিত নয়।
অ্যান্ড্রু ডফি

6
তিনি সম্ভবত পিএইচপি প্রোগ্রামিং করতে অভ্যস্ত।
উইলিয়াম

10
@ উইলিয়াম - এটি দুর্ভাগ্যজনক যে পিএইচপি এখন পিসিআরই
টমাস দিগান

রেজিষ্ট এক্সপ ঠিক আছে, কেবল রেগএক্সপ্রেস থেকে "/" সরিয়ে মান.রেপসএল থেকে ("/ [^ এ-জা-জেড-জ0-9] /", ""); to value.replaceAll ("[^ A-Za-z0-9]", "");
রিজএক্সপ্যাকের

128

চেষ্টা

return value.replaceAll("[^A-Za-z0-9]", "");

অথবা

return value.replaceAll("[\\W]|_", "");

4
আন্ডারস্কোর সহ,return value.replaceAll("\\W", "");
ইরিক্সন

অবশ্যই. সংকলকরা এই ধরণের জিনিস স্পট করতে দুর্দান্ত।
অ্যান্ড্রু ডফি

1
দ্বিতীয়টি প্রশ্নের উত্তর দেয় না। চরিত্রগুলি সম্পর্কে কি: / \ ইত্যাদি?
ডাব্লুডাব্লু

67

আপনার সচেতন হওয়া উচিত যে [^a-zA-Z]অক্ষরগুলি এজেড / এজেডের অক্ষরের মধ্যে নেই range তার মানে বিশেষ অক্ষর পছন্দ é, ßইত্যাদি বা সিরিলিক অক্ষর এবং এই ধরনের সরানো হবে।

যদি এই অক্ষরগুলির প্রতিস্থাপন না হয় তবে পরিবর্তে প্রাক-সংজ্ঞায়িত চরিত্রের ক্লাসগুলি ব্যবহার করতে চান:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

পিএস: \p{Alnum}এই প্রভাবটি অর্জন করে না, এটি একই হিসাবে কাজ করে [A-Za-z0-9]


11
এই পোস্টের জন্য অনেক ধন্যবাদ - এটা আমার জন্য খুব দরকারী ছিল। অতিরিক্তভাবে, আমি বিশ্বাস করি এটিই প্রশ্নের আসল উত্তর। লাতিন বর্ণমালা বিশ্বের একমাত্র নয়!
মাতেভা

2
প্রকৃতপক্ষে, বর্ণিত রেজেক্স "^" কে একটি বৈধ চরিত্র হিসাবে বিবেচনা করবে, যেহেতু "^" কেবলমাত্র প্রথম ঘটনাটি নির্বাচনের অর্থকে অবজ্ঞা করছে। [^\\p{IsAlphabetic}\\p{IsDigit}]ভাল কাজ করে.
বোগদান ক্লিচুক

1
@ জাকুবটুরকোভস্কি ডকসস.অরাকল. com/ জাভাসে / ১০ / ডকস / এপি / জাভা / ইউটিল / রিজেক্স / প্যাটার্ন এইচটিএমএল ইসালফাটিভ এবং ইসডিজিটকে বাইনারি বৈশিষ্ট্য হিসাবে সংজ্ঞায়িত করেছে। আলফা এবং ডিজিট হ'ল পসিএক্স অক্ষর শ্রেণি (কেবলমাত্র ইউএস-এএসসিআইআই)। ডকস.অরাকল . com/javase/10/docs/api/java/util/regex/… বাদে পতাকা নির্দিষ্ট করা আছে।
আন্দ্রে স্টিইংরেস

@ অ্যান্ড্রেস্টেইংস্রেস সঠিক, কারণটি {IsDigit}আমার পক্ষে কাজ করে না এবং {Digit}এটি হ'ল আমি এটি অ্যান্ড্রয়েডে চেষ্টা করছি। এবং অ্যান্ড্রয়েড UNICODE_CHARACTER_CLASSডিফল্টভাবে চালু হয়েছে। ছাড়পত্রের জন্য ধন্যবাদ
জাকুব টারকভস্কি

কীভাবে কেবল আলফা, ডিজিট এবং ইমোজি অনুমতি দেবেন?
রবার্ট গুড্রিক

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

এটি ফাঁকা অক্ষমতা ছেড়ে দেবে । আমি ধরে নিলাম আপনি যা চান অন্যথায়, রেজেক্স থেকে স্থানটি সরিয়ে ফেলুন।


21

আপনি এই সরল রেজেক্সও চেষ্টা করতে পারেন:

 str = str.replaceAll("\\P{Alnum}", "");

2
বা, হোয়াইটস্পেস সংরক্ষণ করে:str.replaceAll("[^\\p{Alnum}\\s]", "")
জোনিক

বা \\p{Alnum}\\p{Space}
membersound

10

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


8

ফাইল নাম তৈরি করার জন্য আমি এই পদ্ধতিটি তৈরি করেছি:

public static String safeChar(String input)
{
    char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
    char[] charArray = input.toString().toCharArray();
    StringBuilder result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) result.append(a);
        }
    }
    return result.toString();
}

5
এটা বেশ নিষ্ঠুরতা। রিজেেক্স হ'ল ওপির পরিস্থিতি নিয়ে যাওয়ার উপায়।
মাইকেল পিটারসন

1
আপনি ঠিক বলেছেন, রেজেক্স আরও ভাল। তবে সেই সময়, আমি এবং আমি ভালভাবে আসিনি along
zneo

হাহ, রেগেক্সের সাথে কেউ কি সত্যিই সেভাবে যেতে পারে? ;)
মাইকেল পিটারসন

6

সমাধান:

value.replaceAll("[^A-Za-z0-9]", "")

ব্যাখ্যা:

[^abc]^বর্গাকার বন্ধনীগুলির মধ্যে যখন কোনও ক্যারেট প্রথম চরিত্র হিসাবে উপস্থিত হয়, তখন এটি প্যাটার্নটিকে তুচ্ছ করে। এই প্যাটার্নটি একটি বা বি বা সি ব্যতীত অন্য কোনও চরিত্রের সাথে মেলে।

মূল শব্দটিকে দুটি ফাংশন হিসাবে দেখছেন:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

তাছাড়া একটি নিদর্শন সম্পর্কিত:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

অতএব এটি প্যাটার্নে অন্তর্ভুক্ত সমস্ত চরকে বিকল্প হিসাবে গ্রহণ করবে


3

আপনি যদি উদাহরণস্বরূপ জার্মান উমলৌটের মতো অ্যাস্কি অক্ষরের সাথে সম্পর্কিত না হয় এমন আলফানিউমারিক অক্ষরগুলিকেও অনুমতি দিতে চান তবে নীচের সমাধানটি ব্যবহার করে বিবেচনা করতে পারেন:

 String value = "your value";

 // this could be placed as a static final constant, so the compiling is only done once
 Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);

 value = pattern.matcher(value).replaceAll("");

দয়া করে নোট করুন যে UNICODE_CHARACTER_CLASS পতাকা ব্যবহারের ক্ষেত্রে পারফরম্যান্স পেনাল্টি চাপিয়ে দেওয়া হতে পারে (এই পতাকার জাভডোক দেখুন)


1

সাধারণ পদ্ধতি:

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

public String normalizeOnlyLettersNumbers(String str) {
    if (!isBlank(str)) {
        return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
    } else {
        return "";
    }
}


1

পেয়ারা ব্যবহার করে আপনি সহজেই বিভিন্ন ধরণের মানদণ্ড একত্রিত করতে পারেন। আপনার নির্দিষ্ট সমাধানের জন্য আপনি ব্যবহার করতে পারেন:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

1

পেয়ারা এর CharMatcher একটি সংক্ষিপ্ত সমাধান প্রদান করে:

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