ড্যাশ বাদে আমি কীভাবে সমস্ত অক্ষর অক্ষর মুছে ফেলব?


606

আমি কীভাবে ড্যাশ এবং স্পেস অক্ষরগুলি বাদ দিয়ে কোনও স্ট্রিং থেকে সমস্ত অ বর্ণানুক্রমিক অক্ষর মুছব?

উত্তর:


868

[^a-zA-Z0-9 -]একটি খালি স্ট্রিং দিয়ে প্রতিস্থাপন করুন ।

Regex rgx = new Regex("[^a-zA-Z0-9 -]");
str = rgx.Replace(str, "");

79
উল্লেখযোগ্য যে উল্লেখ করা -উচিত চরিত্র শ্রেণীর শেষে হওয়া উচিত, বা ব্যাঙ্ক স্ল্যাশ সহ পালাতে হবে, ব্যাপ্তির জন্য ব্যবহার না করা prevent
পিটার বুফটন

6
@ ড্যান আপনার রেজেেক্সে বিশ্ব পতাকাটি সেট করে - এটি ছাড়া এটি কেবল প্রথম ম্যাচটি প্রতিস্থাপন করে। একটি দ্রুত গুগল আপনাকে কীভাবে ক্লাসিক এএসপি রেজেজেটে বিশ্বব্যাপী পতাকা সেট করবেন তা বলা উচিত। অন্যথায় replaceAllপরিবর্তে কোনও ফাংশন সন্ধান করুন replace
আমারঘোষ

20
এখানে একটি রেইজেক্স সংকলিত সংস্করণ রয়েছে: return Regex.Replace(str, "[^a-zA-Z0-9_.]+", "", RegexOptions.Compiled); একই বেসিক প্রশ্ন
পাইগ ওয়াটসন

13
@ এমজিওউইন কারণ প্রতিবার "" ব্যবহার করার সময় আপনি স্ট্রিং অপরিবর্তনীয় হওয়ার কারণে একটি নতুন অবজেক্ট তৈরি করছেন। আপনি যখন স্ট্রিং.এম্পটি ব্যবহার করেন আপনি খালি স্ট্রিং উপস্থাপনের জন্য প্রয়োজনীয় একক দৃষ্টান্ত পুনরায় ব্যবহার করছেন যা তত দ্রুত এবং তত বেশি দক্ষ হওয়ার জন্য।
ব্রায়ান স্কট

17
@ ব্রায়ানস্কট আমি জানি যে এটি পুরানো, তবে একটি অনুসন্ধানে পাওয়া গিয়েছিল তাই আমি মনে করি এটি প্রাসঙ্গিক। এটি আসলে আপনার নীচে চলছে এমন নেট নেট সংস্করণে নির্ভর করে। > 2.0 ব্যবহার করে ""এবং string.Emptyঠিক একই। stackoverflow.com/questions/151472/…
জ্যারেড

348

আমি RegEx ব্যবহার করতে পারতাম, তারা মার্জিত সমাধান সরবরাহ করতে পারে তবে তারা পারফর্ম্যান সমস্যা তৈরি করতে পারে। এখানে একটি সমাধান

char[] arr = str.ToCharArray();

arr = Array.FindAll<char>(arr, (c => (char.IsLetterOrDigit(c) 
                                  || char.IsWhiteSpace(c) 
                                  || c == '-')));
str = new string(arr);

কমপ্যাক্ট ফ্রেমওয়ার্ক ব্যবহার করার সময় (যার ফাইন্ডএল নেই)

ফাইন্ডএলকে 1 দিয়ে প্রতিস্থাপন করুন

char[] arr = str.Where(c => (char.IsLetterOrDigit(c) || 
                             char.IsWhiteSpace(c) || 
                             c == '-')).ToArray(); 

str = new string(arr);

শানফিডেরলি 1 মন্তব্য


41
আমার পরীক্ষায়, এই কৌশলটি আরও দ্রুত ছিল। সুনির্দিষ্টভাবে বলতে গেলে, এটি রেগেক্স রিপ্লেস কৌশলটির চেয়ে 3 গুণ বেশি দ্রুত ছিল।
ড্যান

12
কমপ্যাক্ট ফ্রেমওয়ার্কটিতে ফাইন্ডএল নেই, আপনি ফাইন্ডএল এর সাথে প্রতিস্থাপন করতে পারবেনchar[] arr = str.Where(c => (char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-')).ToArray();
শনফ্যাচারলি

2
কেউ কি এই পরীক্ষা করেছে? এটি মোটেই কাজ করেনি। - তবে এটি আমার জন্য করেছে: স্ট্রিং স্ট্র 2 = নতুন স্ট্রিং (str.Where (c => (char.IsLetterOrDigit (c)))। ToArray ());
কেভিনডিউস

48

আপনি চেষ্টা করতে পারেন:

string s1 = Regex.Replace(s, "[^A-Za-z0-9 -]", "");

কোথায় sআপনার স্ট্রিং।


1
ওপি ড্যাশ নয় আন্ডারস্কোরের জন্য বলেছে
শান বি

39

System.Linq ব্যবহার করা হচ্ছে

string withOutSpecialCharacters = new string(stringWithSpecialCharacters.Where(c =>char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-').ToArray());

@ মিশেল এটি অনুরূপ তবে কমপক্ষে এটি 3 টি লাইনের পরিবর্তে একটি লাইনারের। আমি বলব এটিকে আলাদা উত্তর দেওয়ার পক্ষে যথেষ্ট।
ডায়মাস

1
@Dymas আমি এখন সম্মত হন যে এটা গ্রহণযোগ্য, কিন্তু না কারণ হোয়াইটস্পেস ভিন্ন। দৃশ্যত এই উত্তরটি লেখার পরে যে অংশটি কার্যত সমতুল্য (শুধুমাত্র বর্ণের নাম পৃথক রয়েছে) সম্পাদিত হয়েছিল।
মাইকেল - ক্লে শিরকি

1
@ জয়নালী, আপনি যদি একটি তুচ্ছ সম্পাদনা করেন এবং আমাকে পিং করেন তবে আমি আমার ডাউনটোটকে উল্টে দেব। সাহসী যোদ্ধার কোনও ক্ষোভের জন্য আমি ক্ষমা চাই।
মাইকেল - ক্লে শির্কি

22

রেজেক্সটি হ'ল [^\w\s\-]*:

\sস্পেস ( ) এর পরিবর্তে ব্যবহার করা ভাল , কারণ পাঠ্যে কোনও ট্যাব থাকতে পারে।


1
আপনি যদি ট্যাবগুলি সরাতে না চান তবে
ম্যাট এলেন

... এবং নিউলাইনগুলি এবং অন্যান্য সমস্ত অক্ষর "শ্বেতস্থান" হিসাবে বিবেচিত।
পিটার বুফটন

6
এই সমাধানটি উপরের সমাধানগুলির তুলনায় অনেক উচ্চতর কারণ এটি আন্তর্জাতিক (অ-ইংরেজি) অক্ষরকেও সমর্থন করে। <! - ভাষা: c # -> স্ট্রিং s = "ম্যাটালি ক্রু の: の 氏 名 এবং কানজি 愛 এবং হীরাগানা あ い"; স্ট্রিং r = রেজেক্স। প্রতিস্থাপন (গুলি, "[^ \\ w \\ s -] *", ""); উপরেরগুলি এর সাথে আর উত্পাদন করে: ম্লেলেট ক্রু 日本人 の 氏 名 এবং
কঞ্জি

1
স্ট্রিংতে রূপান্তর থেকে পালাতে @ ব্যবহার করুন: @ "[^ \ w \ s -] *"
জাকুব পাভলিনস্কি

1
এটা, আহ ... আন্ডারস্কোরগুলি সরাবে না? যেটি পুরো সৃষ্টি জুড়ে রেজেক্স বাস্তবায়নের দ্বারা "শব্দ" চরিত্র হিসাবে বিবেচনা করা হয়, তবে এটি বর্ণমালা, ড্যাশ, বা স্থান নয় ... (?)
কোড জকি

14

এই প্রশ্নের উত্তরের ভিত্তিতে, আমি একটি স্থির শ্রেণি তৈরি করেছি এবং এগুলি যুক্ত করেছি। ভেবেছি এটি কিছু লোকের পক্ষে কার্যকর হতে পারে।

public static class RegexConvert
{
    public static string ToAlphaNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z0-9]");
        return rgx.Replace(input, "");
    }

    public static string ToAlphaOnly(this string input)
    {
        Regex rgx = new Regex("[^a-zA-Z]");
        return rgx.Replace(input, "");
    }

    public static string ToNumericOnly(this string input)
    {
        Regex rgx = new Regex("[^0-9]");
        return rgx.Replace(input, "");
    }
}

তারপরে পদ্ধতিগুলি হিসাবে ব্যবহার করা যেতে পারে:

string example = "asdf1234!@#$";
string alphanumeric = example.ToAlphaNumericOnly();
string alpha = example.ToAlphaOnly();
string numeric = example.ToNumericOnly();

2
উদাহরণস্বরূপ যে আপনি সরবরাহ করেছেন এটি কার্যকর হবে যদি আপনি প্রতিটি পদ্ধতির ফলাফল সরবরাহ করেন।
সি-শ্যাভেজ

7

দ্রুত কিছু চান?

public static class StringExtensions 
{
    public static string ToAlphaNumeric(this string self, params char[] allowedCharacters)
    {
        return new string(Array.FindAll(self.ToCharArray(), c => char.IsLetterOrDigit(c) || allowedCharacters.Contains(c)));
    }
}

এটি আপনাকে কোন অক্ষরগুলির পাশাপাশি অনুমতি দিতে চান তা নির্দিষ্ট করার অনুমতি দেবে।


5

এখানে একটি নন-রেজেক্স হিপ বরাদ্দ বন্ধুত্বপূর্ণ দ্রুত সমাধান যা আমি যা খুঁজছিলাম।

অনিরাপদ সংস্করণ।

public static unsafe void ToAlphaNumeric(ref string input)
{
    fixed (char* p = input)
    {
        int offset = 0;
        for (int i = 0; i < input.Length; i++)
        {
            if (char.IsLetterOrDigit(p[i]))
            {
                p[offset] = input[i];
                offset++;
            }
        }
        ((int*)p)[-1] = offset; // Changes the length of the string
        p[offset] = '\0';
    }
}

এবং যারা অনিরাপদ ব্যবহার করতে চান না বা স্ট্রিং দৈর্ঘ্যের হ্যাককে বিশ্বাস করেন না তাদের জন্য।

public static string ToAlphaNumeric(string input)
{
    int j = 0;
    char[] newCharArr = new char[input.Length];

    for (int i = 0; i < input.Length; i++)
    {
        if (char.IsLetterOrDigit(input[i]))
        {
            newCharArr[j] = input[i];
            j++;
        }
    }

    Array.Resize(ref newCharArr, j);

    return new string(newCharArr);
}

4

আইওভ কন্ট্রোল অক্ষরগুলি মুছে ফেলে একটি আলাদা সমাধান তৈরি করেছিল , যা আমার আসল সমস্যা ছিল।

সমস্ত "বিশেষ তবে ভাল" অক্ষর একটি তালিকায় রাখার চেয়ে ভাল

char[] arr = str.Where(c => !char.IsControl(c)).ToArray();    
str = new string(arr);

এটি সহজ, সুতরাং আমি এটি আরও ভাল মনে করি!


2

অনুপ্রেরণা হিসাবে @ata উত্তর ব্যবহার করে এখানে একটি এক্সটেনশন পদ্ধতি রয়েছে ।

"hello-world123, 456".MakeAlphaNumeric(new char[]{'-'});// yields "hello-world123456"

বা যদি আপনার হাইফেন ব্যতীত অতিরিক্ত অক্ষর প্রয়োজন হয় ...

"hello-world123, 456!?".MakeAlphaNumeric(new char[]{'-','!'});// yields "hello-world123456!"


public static class StringExtensions
{   
    public static string MakeAlphaNumeric(this string input, params char[] exceptions)
    {
        var charArray = input.ToCharArray();
        var alphaNumeric = Array.FindAll<char>(charArray, (c => char.IsLetterOrDigit(c)|| exceptions?.Contains(c) == true));
        return new string(alphaNumeric);
    }
}

1

আমি এখানে উত্তরের একটি বৈচিত্র ব্যবহার করি use আমি স্পেসগুলি "-" দিয়ে প্রতিস্থাপন করতে চাই যাতে এর এসইও বন্ধুত্বপূর্ণ হয় এবং ছোট হাতের অক্ষরও তৈরি হয়। এছাড়াও আমার পরিষেবা স্তর থেকে system.web রেফারেন্স নয়।

private string MakeUrlString(string input)
{
    var array = input.ToCharArray();

    array = Array.FindAll<char>(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-');

    var newString = new string(array).Replace(" ", "-").ToLower();
    return newString;
}

0

এখানে একটি খুব সংক্ষিপ্ত সংস্করণ

myString = myString.replace(/[^A-Za-z0-9 -]/g, "");

-1

রেইগেক্সের সাথে অনেক সহজ উপায় রয়েছে।

private string FixString(string str)
{
    return string.IsNullOrEmpty(str) ? str : Regex.Replace(str, "[\\D]", "");
}

1
কেবলমাত্র অ-সংখ্যাসূচক অক্ষরগুলিকে প্রতিস্থাপন করে
17'17 12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.