বন্ধনী (গোলাকার বন্ধনী) এর মধ্যে থাকা পাঠ্য আমি কীভাবে বের করব?


224

আমার একটি স্ট্রিং আছে User name (sales)এবং আমি বন্ধনীগুলির মধ্যে লেখাটি বের করতে চাই, আমি এটি কীভাবে করব?

আমি উপ-স্ট্রিং সন্দেহ করি কিন্তু বন্ধ বন্ধনী পর্যন্ত কীভাবে পড়তে হবে তা আমি কাজ করতে পারি না, পাঠ্যের দৈর্ঘ্য পৃথক হবে।


2
আপনি যা চেষ্টা করেছেন তা আমাদের দেখান। আপনি কি নিয়মিত এক্সপ্রেশন ব্যবহার করে দেখেছেন?
জর্জ স্টকার

উত্তর:


445

আপনি যদি নিয়মিত প্রকাশ থেকে দূরে থাকতে চান তবে আমি সবচেয়ে সহজ উপায়টি ভাবতে পারি:

string input = "User name (sales)";
string output = input.Split('(', ')')[1];

91
সত্য, এটি উত্তর হিসাবে নির্বাচন করা উচিত ছিল।
প্যাট লিন্ডলি

1
এটি আরও input.Split মধ্যে সংকুচিত করা হয় ( "()" ToCharArray ()।) [1]
প্রভাকরণ

14
এবং আপনি যদি একাধিক নির্বাচন করতে একই যুক্তি ব্যবহার করতে চান:var input = "(fdw) User name (sales) safdsdf (again?)"; var output = input.Split('(', ')').Where((item, index) => index % 2 != 0).ToList();
WtFudgE

1
হুঁশিয়ার এই সমাধান নির্যাস যে salesইনপুট স্ট্রিং থেকে ধারণকারী )sales(, (sales(ইত্যাদি
স্টেফানো Spinucci

435

এটি করার একটি খুব সহজ উপায় হ'ল নিয়মিত এক্সপ্রেশন ব্যবহার করে:

Regex.Match("User name (sales)", @"\(([^)]*)\)").Groups[1].Value

(খুব মজার) মন্তব্যের প্রতিক্রিয়া হিসাবে, এখানে কিছু ব্যাখ্যা সহ একই রেজেক্স:

\(             # Escaped parenthesis, means "starts with a '(' character"
    (          # Parentheses in a regex mean "put (capture) the stuff 
               #     in between into the Groups array" 
       [^)]    # Any character that is not a ')' character
       *       # Zero or more occurrences of the aforementioned "non ')' char"
    )          # Close the capturing group
\)             # "Ends with a ')' character"

504
লোকেরা যখন বলে যে "একটি সহজ উপায় হ'ল নিয়মিত ভাব প্রকাশ করা হয়" এবং তারপরে অনিবার্য হায়ারোগ্লিফিক্সের স্ট্রিংয়ের পরিমাণের পরিমাণটি প্রস্তাব করে (এটি বিশেষত মজার হয় যখন আলাদা আলাদা লোকেরা রেজেক্সের পরামর্শ দেয় এবং প্রত্যেকে একই সমস্যার জন্য হায়ারোগ্লাইফিক্সের বিভিন্ন সেট নিয়ে আসে) )। :)
ডেলিটিক্স

47
স্ট্যাকের প্রায় যথেষ্ট উত্তর নেই যা আসলে যা চলছে তা ব্যাখ্যা করে explain অসাধারণ ব্যাখ্যার জন্য আপনাকে ধন্যবাদ
স্যান্ডি গিফোর্ড 21

আপনি যদি ভিক্ষা শুরুতে '@' ব্যবহার করেন তবে আমার মনে হয় আপনার প্রথম বন্ধনী থেকে বাঁচার দরকার নেই?
র‌্যাঙ্ক 1

10
@ রেঙ্ক 1 আপনার অবশ্যই প্রথম বন্ধনী থেকে বাঁচতে হবে। @ এখানে যে অফার রয়েছে তা হ'ল আপনার ব্যাকস্ল্যাশ থেকে বাঁচার দরকার নেই। সুতরাং @ ছাড়া এটি "\\ (([^)] *) \\)" এর মতো হবে।
ডায়াডিসটিস

এটি যদিও নেস্টেড গোষ্ঠীগুলি পরিচালনা করে না। এতে পরিবর্তন করা হয়েছেvar filterRegex = new Regex(Regex.Escape("(") + "([^()]*)" + Regex.Escape(")"));
জান ভ্যান ডের হেইজেন

91

ধরে নিচ্ছি যে আপনার কাছে কেবল একটি জুটি বন্ধনী রয়েছে।

string s = "User name (sales)";
int start = s.IndexOf("(") + 1;
int end = s.IndexOf(")", start);
string result = s.Substring(start, end - start);

7
আপনি যদি (বিক্রয়) পরিবর্তে "বিক্রয়" চান তবে স্ট্রিংগুলিতে +1 শুরু করা আরও সঠিক
জোজে

1
হ্যাপেনড এস = "ব্যবহারকারীর নাম" (বিক্রয়) "কী হবে?
dotnetstep

@dotnetstep তুমি সঠিক হতে পারে উচিত int end = s.IndexOf(")", start);। আমি একটি সম্পাদনা সারিবদ্ধ করেছি ...
ক্রিসডি

1
"(" .Length; +1 টি চেয়ে ভাল একটি সম্পাদনা পাঠানো এছাড়াও একটি ফাংশন
Ave নগরী:

24

এই ফাংশনটি ব্যবহার করুন:

public string GetSubstringByString(string a, string b, string c)
    {
        return c.Substring((c.IndexOf(a) + a.Length), (c.IndexOf(b) - c.IndexOf(a) - a.Length));
    }

এবং এখানে ব্যবহার:

GetSubstringByString("(", ")", "User name (sales)")

এবং আউটপুট হবে:

sales

16

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

কিছুটা এইরকম:

Regex regex = new Regex("\\((?<TextInsideBrackets>\\w+)\\)");
string incomingValue = "Username (sales)";
string insideBrackets = null;
Match match = regex.Match(incomingValue);
if(match.Success)
{
    insideBrackets = match.Groups["TextInsideBrackets"].Value;
}

14
string input = "User name (sales)";

string output = input.Substring(input.IndexOf('(') + 1, input.IndexOf(')') - input.IndexOf('(') - 1);

1
আপনার অবশ্যই অবশ্যই প্রথম বন্ধনীটির অবস্থান একবারে গণনা করা উচিত।
মার্টিন ব্রাউন

আপনার অভ্যন্তরীণ প্রথম বন্ধনী রয়েছে এমন ক্ষেত্রে যেমন input = "User name (sales(1))আপনি input.LastIndexOf(')')অভ্যন্তরীণ প্রথম বন্ধনী থাকলে বা না থাকলে এটি কাজ করতে পারে।
বেন

13

একটি রেজেক্স হতে পারে? আমি মনে করি এটি কাজ করবে ...

\(([a-z]+?)\)

7
using System;
using System.Text.RegularExpressions;

private IEnumerable<string> GetSubStrings(string input, string start, string end)
{
    Regex r = new Regex(Regex.Escape(start) +`"(.*?)"`  + Regex.Escape(end));
    MatchCollection matches = r.Matches(input);
    foreach (Match match in matches)
    yield return match.Groups[1].Value;
}

4

একটি নিয়মিত এক্সপ্রেশন ব্যবহার করুন:

string test = "(test)"; 
string word = Regex.Match(test, @"\((\w+)\)").Groups[1].Value;
Console.WriteLine(word);



2

regexপদ্ধতি আমি মনে করি শ্রেয়, কিন্তু আপনি নম্র ব্যবহার করতে চেয়েছিলেন যদিsubstring

string input= "my name is (Jayne C)";
int start = input.IndexOf("(");
int stop = input.IndexOf(")");
string output = input.Substring(start+1, stop - start - 1);

অথবা

string input = "my name is (Jayne C)";
string output  = input.Substring(input.IndexOf("(") +1, input.IndexOf(")")- input.IndexOf("(")- 1);

1

এখানে একটি সাধারণ উদ্দেশ্যে পঠনযোগ্য ফাংশন যা রেইগেক্স ব্যবহার করা এড়িয়ে চলে:

// Returns the text between 'start' and 'end'.
string ExtractBetween(string text, string start, string end)
{
  int iStart = text.IndexOf(start);
  iStart = (iStart == -1) ? 0 : iStart + start.Length;
  int iEnd = text.LastIndexOf(end);
  if(iEnd == -1)
  {
    iEnd = text.Length;
  }
  int len = iEnd - iStart;

  return text.Substring(iStart, len);
}

এটিকে আপনার বিশেষ উদাহরণে কল করতে আপনি এটি করতে পারেন:

string result = ExtractBetween("User name (sales)", "(", ")");

1

আমি খুঁজে পেয়েছি যে নিয়মিত প্রকাশগুলি অত্যন্ত দরকারী তবে লেখা খুব কঠিন very সুতরাং, আমি কিছু গবেষণা করেছি এবং এই সরঞ্জামটি পেয়েছি যা তাদের লিখনকে এত সহজ করে তোলে।

এগুলি থেকে লজ্জা পাবেন না কারণ সিনট্যাক্সটি বের করা কঠিন। তারা এত শক্তিশালী হতে পারে।


2
তাই আপনাকে স্বাগতম! এটি ভাল পরামর্শ, তবে এটি উত্তর হিসাবে পোস্ট করা উচিত হয়নি। এর মতো সাধারণ পরামর্শটি মন্তব্য হিসাবে পোস্ট করা উচিত at একটি উত্তরে অবশ্যই প্রশ্নকারীকে সুনির্দিষ্ট সমস্যার সমাধান করতে হবে। আমি জানি আপনার কাছে মন্তব্য পোস্ট করার মতো পর্যাপ্ত খ্যাতি পয়েন্ট নেই, তবে ঠিক এই কারণেই প্রতিবেদনের দ্বারটি বিদ্যমান। আপনি যখন কিছুটা বেশি সময় নিয়ে এসেছেন আপনি দেখতে পাবেন যে লোকেরা সবসময় রুবুলারের মতো সরঞ্জামগুলির প্রস্তাব দিচ্ছে (মন্তব্যগুলিতে অবশ্যই)। অন্য কথায়, এই পরামর্শটি কার্যকর হতে পারে তবে এটি জরুরি নয়।
অ্যালান মুর

0

আমি খুব অনুরূপ বাস্তবায়নের সমাধান সন্ধান করতে গিয়ে আমি এটি পেরিয়ে এসেছি।

আমার আসল কোড থেকে এখানে একটি স্নিপেট। প্রথম চর থেকে সূচকের সূচনা (সূচক 0)।

 string separator = "\n";     //line terminator

 string output;
 string input= "HowAreYou?\nLets go there!";

 output = input.Substring(0, input.IndexOf(separator)); 

এটি ওপি যা বলেছে তার উত্তর দেয় না।
dicemaster

0

এই কোডটি এখানে বেশিরভাগ সমাধানের চেয়ে দ্রুত (সমস্ত না থাকলে) স্ট্রিং এক্সটেনশন পদ্ধতি হিসাবে প্যাক করা হয়েছে , এটি পুনরাবৃত্ত নীড় সমর্থন করে না:

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    while(++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            break;
        }
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}

এইটি কিছুটা দীর্ঘ এবং ধীর, তবে এটি পুনরাবৃত্ত নীড়গুলি আরও সুন্দরভাবে পরিচালনা করে:

public static string GetNestedString(this string str, char start, char end)
{
    int s = -1;
    int i = -1;
    while (++i < str.Length)
        if (str[i] == start)
        {
            s = i;
            break;
        }
    int e = -1;
    int depth = 0;
    while (++i < str.Length)
        if (str[i] == end)
        {
            e = i;
            if (depth == 0)
                break;
            else
                --depth;
        }
        else if (str[i] == start)
            ++depth;
    if (e > s)
        return str.Substring(s + 1, e - s - 1);
    return null;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.