সাবস্ট্রিং পান - নির্দিষ্ট চরের আগে সবকিছু


124

আমি স্ট্রিং - অক্ষরটির আগে সমস্ত কিছু পাওয়ার সর্বোত্তম উপায়টি বের করার চেষ্টা করছি। কিছু উদাহরণ স্ট্রিং নীচে আছে। স্ট্রিংয়ের দৈর্ঘ্য আগে - পরিবর্তিত হয় এবং যে কোনও দৈর্ঘ্য হতে পারে

223232-1.jpg
443-2.jpg
34443553-5.jpg

সুতরাং আমার আগে 0 এর শুরু সূচক থেকে শুরু করে ডানদিকে এর মানটি দরকার -। সুতরাং সাবস্ট্রিংগুলি 223232, 443 এবং 34443553 এ পরিণত হবে

উত্তর:


144

। নেট ফিডল উদাহরণ

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("223232-1.jpg".GetUntilOrEmpty());
        Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
        Console.WriteLine("34443553-5.jpg".GetUntilOrEmpty());

        Console.ReadKey();
    }
}

static class Helper
{
    public static string GetUntilOrEmpty(this string text, string stopAt = "-")
    {
        if (!String.IsNullOrWhiteSpace(text))
        {
            int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal);

            if (charLocation > 0)
            {
                return text.Substring(0, charLocation);
            }
        }

        return String.Empty;
    }
}

ফলাফল:

223232
443
34443553
344

34

2
দয়া করে তাদের পক্ষে একটি অনুগ্রহ করুন এবং ত্রুটি যাচাইয়ের পাশাপাশি ধরে নিবেন যে তিনি এর বাইরে কোনও ফাংশন তৈরি করার পরিকল্পনা করছেন :)
— জোশ

ধন্যবাদ আমি এর কাছাকাছি ছিলাম, তবে আগ্রহী ছিলাম যদি কারও কাছে এই কম্বো বাদে অন্যরকম করার উপায় ছিল। তবে হ্যাঁ এটি দুর্দান্ত কাজ করে এবং এখনও খুব ছোট।
— PositiveGuy

14
আপনি যদি যথাযথ "খুঁজে পাওয়া যায়নি" চেক না করে যদি ওয়ান-লাইনার চাইতেন তবে আপনি এরকম কিছু করতে পারেন:string result = source.Substring(0, Math.Max(source.IndexOf('-'), 0))
— লুক

2
স্ট্রিংয়ের দৈর্ঘ্য কঠোরভাবে অতিক্রম করার পরে (এখানে এখানে) পরিচিত হয়ে গেলে তার পরিবর্তে s.Substring(0, n)কেউ ব্যবহার করতে পারেন । s.Remove(n)sn
— জেপ্পে স্টিগ নীলসন

@ লুকাহ যদি আপনার উদাহরণে সূচি -1 ফেরায়, তবে একটি খালি স্ট্রিং ফিরে আসবে, তাই না?
— ক্রাশ করুন

124

বিভক্ত ফাংশন ব্যবহার করুন ।

static void Main(string[] args)
{
    string s = "223232-1.jpg";
    Console.WriteLine(s.Split('-')[0]);
    s = "443-2.jpg";
    Console.WriteLine(s.Split('-')[0]);
    s = "34443553-5.jpg";
    Console.WriteLine(s.Split('-')[0]);

Console.ReadKey();
}

যদি আপনার স্ট্রিংটিতে একটি না থাকে -তবে আপনি পুরো স্ট্রিংটি পাবেন।


4
এবং যদি আপনার একাধিক হাইফেন থাকে তবে আপনি আপনার অ্যারেতে একাধিক উপাদান পান।
— জেমস ডান

2
আসলে, জেমস, সুতরাং এটি কেবল তখনই সমাধান হতে পারে যদি আপনি কেবলমাত্র একটি একক হাইফেন আশা করেন। আমি মনে করি আপনি যা চান তা পেতে আপনি স্কিপ এবং সামগ্রিকের মতো লিনক পদ্ধতি ব্যবহার করতে পারেন তবে ইতিমধ্যে প্রস্তাবিত পদ্ধতিগুলির চেয়ে আপনি আরও কোড পেয়েছেন। এটি সমস্ত কিছুর উপর নির্ভর করে আগত ডেটা সম্পর্কে।
— ডোমিনিক ক্রোনিন

7
এবং কয়েক বছর পরে, আমি ঠিক বুঝতে পেরেছি যে আমি জেমসের বক্তব্যকে স্বীকার করার জন্য খুব দ্রুত ছিলাম। প্রশ্নটি একটি নির্দিষ্ট চরিত্রের আগে স্ট্রিংটি কীভাবে সন্ধান করতে পারে তা জিজ্ঞাসা করে। এই চরিত্রের আরও উদাহরণগুলি এইভাবে অপ্রাসঙ্গিক এবং [0] নেওয়া "কেবলমাত্র কাজ করবে"। অবশ্যই, এটি এখনও আগত ডেটার উপর আমরা কতটা বিশ্বাস করি তার উপর নির্ভর করে। কিছু না হলে '-' কি হবে?
— ডোমিনিক ক্রোনিন

1
আমি মনে করি @ জেমসডুন পয়েন্টটি ছিল যে অ্যারেতে বিভক্ত হয়ে আপনি অযৌক্তিক স্ট্রিংয়ের একটি গুচ্ছ তৈরি করছেন - অপ্রয়োজনীয় আবর্জনা।
— ক্রাশ করুন

1
আমি "অপ্রয়োজনীয় আবর্জনা" নিয়ে চিন্তা করব না। এইভাবে তৈরি হওয়া কোনও অতিরিক্ত স্ট্রিং তাত্ক্ষণিকভাবে অ্যাক্সেসযোগ্য এবং তাই প্রজন্মের 0 তে সংগ্রহ করা হবে, এটি সত্যই অত্যন্ত নিম্ন ওভারহেড। আবর্জনা সংগ্রহকারী ডিজাইনটি স্পষ্টভাবে উদ্দেশ্য করে বিপুল সংখ্যক স্বল্প-জীবিত আইটেমকে প্রায় কোনও ব্যয় ছাড়াই ব্যবহার করার অনুমতি দেয়।
— ডোমিনিক ক্রোনিন

65
String str = "223232-1.jpg"
int index = str.IndexOf('-');
if(index > 0) {
    return str.Substring(0, index)
}

upvote কারণ আমার বিভাজকের সূচি জানতে হবে
— পিয়েরো আলবার্তো

3
এটি ফ্রেডউ যেভাবে উত্তর দিয়েছেন (বর্তমানে শীর্ষের উত্তরটি দেওয়া হয়েছে) তা ছাড়া এটি যেখানে কোনও মিল খুঁজে পাওয়া যায় না সেই ক্ষেত্রে হ্যান্ডলিং বাদ দেয়।
— ডমিনিক ক্রোনিন

7

এই থ্রেডটি শুরু হওয়ার পর থেকে জিনিসগুলি কিছুটা এগিয়ে গেছে।

এখন, আপনি ব্যবহার করতে পারেন

string.Concat(s.TakeWhile((c) => c != '-'));

এটি কীভাবে পারফরম্যান্সের সাথে সুস্পষ্ট সূচক ও সাবস্ট্রিং সংমিশ্রণের তুলনা করে? আমি ধরে নিলাম এটি প্রতিটি চরিত্রকে একটি স্ট্রিংবিল্ডারে সংযুক্ত করছে এবং তারপরে শেষে একটি স্ট্রিং তৈরি করছে। এছাড়াও বেশ কয়েকটি ফাংশন কল মিশ্রিত হয়েছে nice ভাল লাগত যদি সাবস্ট্রিং কেবল "দৈর্ঘ্য" যুক্তি হিসাবে "স্ট্রিংয়ের সমাপ্তি" হিসাবে -1 নিতে পারত।
— ক্রাশ করুন

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

4

এটি করার একটি উপায় এর সাথে String.Substringএকসাথে ব্যবহার করা String.IndexOf:

int index = str.IndexOf('-');
string sub;
if (index >= 0)
{
    sub = str.Substring(0, index);
}
else
{
    sub = ... // handle strings without the dash
}

0 অবস্থানে থেকে শুরু করে, সমস্ত পাঠ্য ড্যাশ পর্যন্ত ফিরিয়ে দিন, তবে অন্তর্ভুক্ত নয়।


যদি সূচক <= 0 হয় তবে আপনার কেবল স্ট্রিং.ইম্পটি ফেরা উচিত।
— কোনও ফেরত পাওয়া যাবে না

5
@ এনআরএনআর: আপনি যদি তাই বলেন। ওপি ব্যবসায়ের প্রয়োজনীয়তাগুলি আপনি বা আমি জানে না
— মাইকেল পেট্রোটা

0

BrainCore এর উত্তর উপর বিল্ডিং:

    int index = 0;   
    str = "223232-1.jpg";

    //Assuming we trust str isn't null 
    if (str.Contains('-') == "true")
    {
      int index = str.IndexOf('-');
    }

    if(index > 0) {
        return str.Substring(0, index);
    }
    else {
       return str;
    }

0

আপনি এই উদ্দেশ্যে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন, তবে নিয়মিত অভিব্যক্তির বিপরীতে ইনপুট স্ট্রিং মিল না থাকলে অতিরিক্ত ব্যতিক্রম এড়ানো ভাল।

রেজেক্স প্যাটার্নে পালানোর অতিরিক্ত মাথাব্যথা এড়াতে প্রথমে - আমরা কেবল সেই উদ্দেশ্যে ফাংশনটি ব্যবহার করতে পারি:

String reStrEnding = Regex.Escape("-");

আমি জানি যে এটি কিছুই করে না - যেমন "-" তেমন একই Regex.Escape("=") == "=", তবে চরিত্রটি থাকলে উদাহরণস্বরূপ এটি পৃথক হবে @"\"।

তারপরে আমাদের স্ট্রিংয়ের ভিক্ষা থেকে শুরু করে স্ট্রিং এন্ডিংয়ের সাথে মিলিয়ে নেওয়া দরকার, অথবা পর্যায়ক্রমে যদি শেষ না পাওয়া যায় - তবে কিছুই মিলবে না। (খালি স্ট্রিং)

Regex re = new Regex("^(.*?)" + reStrEnding);

যদি আপনার অ্যাপ্লিকেশনটি পারফরম্যান্সের সমালোচনা করে থাকে - তবে নতুন রেজেক্সের জন্য আলাদা লাইন, যদি তা না হয় - আপনার কাছে সমস্ত কিছু এক লাইনে থাকতে পারে।

এবং পরিশেষে স্ট্রিংয়ের সাথে মেলে এবং মিলিত প্যাটার্নটি বের করুন:

String matched = re.Match(str).Groups[1].ToString();

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

using System;
using System.Text.RegularExpressions;

static class Helper
{
    public static string GetUntilOrEmpty(this string text, string stopAt = "-")
    {
        return new Regex("^(.*?)" + Regex.Escape(stopAt)).Match(text).Groups[1].Value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Regex re = new Regex("^(.*?)-");
        Func<String, String> untilSlash = (s) => { return re.Match(s).Groups[1].ToString(); };

        Console.WriteLine(untilSlash("223232-1.jpg"));
        Console.WriteLine(untilSlash("443-2.jpg"));
        Console.WriteLine(untilSlash("34443553-5.jpg"));
        Console.WriteLine(untilSlash("noEnding(will result in empty string)"));
        Console.WriteLine(untilSlash(""));
        // Throws exception: Console.WriteLine(untilSlash(null));

        Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
    }
}

বিটিডব্লিউ - রেজেক্স প্যাটার্ন পরিবর্তন করে প্যাটার্ন "^(.*?)(-|$)"না হওয়া অবধি "-"বা প্যাটার্নটি খুঁজে পাওয়া না গেলে - স্ট্রিংয়ের শেষ অবধি সবকিছু বাছাই করা।


0

লিনকুই উপায়

স্ট্রিং.কনকাট ("223232-1.jpg"। টেকহইল (সি => সি! = '-'))

(তবে, আপনাকে নাল পরীক্ষা করার দরকার নেই;)

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