আমার মতো স্ট্রিং রয়েছে:
"super exemple of string key : text I want to keep - end of my string"
আমি শুধু যে স্ট্রিংটি মধ্যে রাখতে চান "key : "এবং " - "। আমি এটা কিভাবে করবো? আমি কি একটি রেজেক্স ব্যবহার করব বা আমি এটি অন্য উপায়ে করতে পারি?
আমার মতো স্ট্রিং রয়েছে:
"super exemple of string key : text I want to keep - end of my string"
আমি শুধু যে স্ট্রিংটি মধ্যে রাখতে চান "key : "এবং " - "। আমি এটা কিভাবে করবো? আমি কি একটি রেজেক্স ব্যবহার করব বা আমি এটি অন্য উপায়ে করতে পারি?
উত্তর:
সম্ভবত, একটি ভাল উপায় কেবল একটি স্ট্রিং কেটে ফেলা হয় :
String St = "super exemple of string key : text I want to keep - end of my string";
int pFrom = St.IndexOf("key : ") + "key : ".Length;
int pTo = St.LastIndexOf(" - ");
String result = St.Substring(pFrom, pTo - pFrom);
string input = "super exemple of string key : text I want to keep - end of my string";
var match = Regex.Match(input, @"key : (.+?)-").Groups[1].Value;
বা কেবল স্ট্রিং অপারেশন সহ
var start = input.IndexOf("key : ") + 6;
var match2 = input.Substring(start, input.IndexOf("-") - start);
আপনি এটি রেগেক্স ছাড়াই করতে পারেন
input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
.Split('-')[0]
.Trim();
আপনি নিজের বাস্তবায়নটি কতটা শক্তিশালী / নমনীয় করতে চান তার উপর নির্ভর করে এটি আসলে কিছুটা জটিল হতে পারে। আমি ব্যবহার করছি বাস্তবায়ন এখানে:
public static class StringExtensions {
/// <summary>
/// takes a substring between two anchor strings (or the end of the string if that anchor is null)
/// </summary>
/// <param name="this">a string</param>
/// <param name="from">an optional string to search after</param>
/// <param name="until">an optional string to search before</param>
/// <param name="comparison">an optional comparison for the search</param>
/// <returns>a substring based on the search</returns>
public static string Substring(this string @this, string from = null, string until = null, StringComparison comparison = StringComparison.InvariantCulture)
{
var fromLength = (from ?? string.Empty).Length;
var startIndex = !string.IsNullOrEmpty(from)
? @this.IndexOf(from, comparison) + fromLength
: 0;
if (startIndex < fromLength) { throw new ArgumentException("from: Failed to find an instance of the first anchor"); }
var endIndex = !string.IsNullOrEmpty(until)
? @this.IndexOf(until, startIndex, comparison)
: @this.Length;
if (endIndex < 0) { throw new ArgumentException("until: Failed to find an instance of the last anchor"); }
var subString = @this.Substring(startIndex, endIndex - startIndex);
return subString;
}
}
// usage:
var between = "a - to keep x more stuff".Substring(from: "-", until: "x");
// returns " to keep "
InvariantCultureউইন্ডোজ ইউনিভার্সাল অ্যাপসের সাথে কাজ করছে না। এটি আপনার ক্লাসের কার্যকারিতা বজায় রেখে মুছে ফেলার কোনও উপায় আছে কি? @ চেজমেডালিয়ন
আমি মনে করি এটি কাজ করে:
static void Main(string[] args)
{
String text = "One=1,Two=2,ThreeFour=34";
Console.WriteLine(betweenStrings(text, "One=", ",")); // 1
Console.WriteLine(betweenStrings(text, "Two=", ",")); // 2
Console.WriteLine(betweenStrings(text, "ThreeFour=", "")); // 34
Console.ReadKey();
}
public static String betweenStrings(String text, String start, String end)
{
int p1 = text.IndexOf(start) + start.Length;
int p2 = text.IndexOf(end, p1);
if (end == "") return (text.Substring(p1));
else return text.Substring(p1, p2 - p1);
}
আমি কীভাবে এটি করতে পারি তা এখানে
public string Between(string STR , string FirstString, string LastString)
{
string FinalString;
int Pos1 = STR.IndexOf(FirstString) + FirstString.Length;
int Pos2 = STR.IndexOf(LastString);
FinalString = STR.Substring(Pos1, Pos2 - Pos1);
return FinalString;
}
string.Split।
একটি কার্যকারী লিনকিউ সমাধান:
string str = "super exemple of string key : text I want to keep - end of my string";
string res = new string(str.SkipWhile(c => c != ':')
.Skip(1)
.TakeWhile(c => c != '-')
.ToArray()).Trim();
Console.WriteLine(res); // text I want to keep
string str="super exemple of string key : text I want to keep - end of my string";
int startIndex = str.IndexOf("key") + "key".Length;
int endIndex = str.IndexOf("-");
string newString = str.Substring(startIndex, endIndex - startIndex);
বা, একটি রেজেক্স সহ।
using System.Text.RegularExpressions;
...
var value =
Regex.Match(
"super exemple of string key : text I want to keep - end of my string",
"key : (.*) - ")
.Groups[1].Value;
একটি চলমান উদাহরণ সহ ।
এর ওভারকিল কিনা তা আপনি সিদ্ধান্ত নিতে পারেন।
একটি বৈধ এক্সটেনশন পদ্ধতি হিসাবে
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var value =
"super exemple of string key : text I want to keep - end of my string"
.Between(
"key : ",
" - ");
Console.WriteLine(value);
}
}
public static class Ext
{
static string Between(this string source, string left, string right)
{
return Regex.Match(
source,
string.Format("{0}(.*){1}", left, right))
.Groups[1].Value;
}
}
যেহেতু :এবং -যেগুলি অনন্য আপনি ব্যবহার করতে পারেন:
string input;
string output;
input = "super example of string key : text I want to keep - end of my string";
output = input.Split(new char[] { ':', '-' })[1];
আপনি নীচে এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন:
public static string GetStringBetween(this string token, string first, string second)
{
if (!token.Contains(first)) return "";
var afterFirst = token.Split(new[] { first }, StringSplitOptions.None)[1];
if (!afterFirst.Contains(second)) return "";
var result = afterFirst.Split(new[] { second }, StringSplitOptions.None)[0];
return result;
}
ব্যবহার হ'ল:
var token = "super exemple of string key : text I want to keep - end of my string";
var keyValue = token.GetStringBetween("key : ", " - ");
আমি বিজয় সিং রানা থেকে কোড স্নিপেট ব্যবহার করেছি যা মূলত কাজটি করে। যদি এটি firstStringইতিমধ্যে থাকে তবে এটি সমস্যা তৈরি করে lastString। আমি যা চাইছিলাম তা ছিল কোনও জেএসএন প্রতিক্রিয়া (কোনও জেএসএন পার্সার বোঝা হয়নি) থেকে একটি অ্যাক্সেস টোকন বের করা। আমার firstStringছিল \"access_token\": \"এবং আমার lastStringছিল \"। আমি একটু পরিবর্তন করে শেষ করেছি
string Between(string str, string firstString, string lastString)
{
int pos1 = str.IndexOf(firstString) + firstString.Length;
int pos2 = str.Substring(pos1).IndexOf(lastString);
return str.Substring(pos1, pos2);
}
যদি আপনি 1 লাইন সমাধান সন্ধান করেন তবে এটি হ'ল:
s.Substring(s.IndexOf("eT") + "eT".Length).Split("97".ToCharArray()).First()
সম্পূর্ণ 1 লাইন সমাধান, সাথে System.Linq:
using System;
using System.Linq;
class OneLiner
{
static void Main()
{
string s = "TextHereTisImortant973End"; //Between "eT" and "97"
Console.WriteLine(s.Substring(s.IndexOf("eT") + "eT".Length)
.Split("97".ToCharArray()).First());
}
}
সি # 8.0 এবং উপরে, আপনি পরিসীমা অপারেটর ব্যবহার করতে পারেন ..হিসাবে
var s = "header-THE_TARGET_STRING.7z";
var from = s.IndexOf("-") + "-".Length;
var to = s.IndexOf(".7z");
var versionString = s[from..to]; // THE_TARGET_STRING
বিশদ জন্য ডকুমেন্টেশন দেখুন ।
আপনি যদি স্ট্রিং জোড়াগুলির একাধিক উপস্থিতি পরিচালনা করতে চান তবে RegEx ছাড়া এটি সহজ হবে না:
Regex.Matches(input ?? String.Empty, "(?=key : )(.*)(?<= - )", RegexOptions.Singleline);
input ?? String.Emptyযুক্তি নাল ব্যতিক্রম এড়ানো?=1 ম সাবস্ট্রিং?<=রাখে এবং 2 য় সাবস্ট্রিং রাখেRegexOptions.Singlelineস্ট্রিং জোড়ার মধ্যে নতুন লাইনের অনুমতি দেয়
যদি সাবস্ট্রিংয়ের ক্রম এবং সংঘটন গণনাটি বিবেচনা না করে তবে এই দ্রুত এবং নোংরা একটি বিকল্প হতে পারে:
var parts = input?.Split(new string[] { "key : ", " - " }, StringSplitOptions.None);
string result = parts?.Length >= 3 ? result[1] : input;
কমপক্ষে এটি বেশিরভাগ ব্যতিক্রমকে এড়িয়ে চলে, যদি না / একক সাবস্ট্রিংয়ের সাথে মেলে না তবে মূল স্ট্রিংটি ফিরিয়ে।
private string gettxtbettwen(string txt, string first, string last)
{
StringBuilder sb = new StringBuilder(txt);
int pos1 = txt.IndexOf(first) + first.Length;
int len = (txt.Length ) - pos1;
string reminder = txt.Substring(pos1, len);
int pos2 = reminder.IndexOf(last) - last.Length +1;
return reminder.Substring(0, pos2);
}
আপনার ইতিমধ্যে কিছু ভাল উত্তর রয়েছে এবং আমি বুঝতে পারি যে আমি সরবরাহ করছি কোডটি সবচেয়ে কার্যকর এবং পরিষ্কার থেকে অনেক দূরে। তবে আমি ভেবেছিলাম এটি শিক্ষাগত উদ্দেশ্যে কার্যকর হতে পারে। আমরা সারা দিন ধরে প্রাক-বিল্ট ক্লাস এবং লাইব্রেরি ব্যবহার করতে পারি। তবে অভ্যন্তরীণ কাজগুলি না বুঝে আমরা কেবল নকল করছি এবং পুনরাবৃত্তি করছি এবং কখনই কিছুই শিখব না। এই কোডটি কাজ করে এবং অন্যগুলির তুলনায় আরও বেসিক বা "কুমারী":
char startDelimiter = ':';
char endDelimiter = '-';
Boolean collect = false;
string parsedString = "";
foreach (char c in originalString)
{
if (c == startDelimiter)
collect = true;
if (c == endDelimiter)
collect = false;
if (collect == true && c != startDelimiter)
parsedString += c;
}
আপনি আপনার পছন্দসই স্ট্রিংটি পার্সড স্ট্রিং ভেরিয়েবলের জন্য নির্ধারিত করবেন। মনে রাখবেন যে এটি অগ্রগতি এবং পূর্ববর্তী স্থানগুলিও ক্যাপচার করবে। মনে রাখবেন যে স্ট্রিং কেবলমাত্র অক্ষরের একটি অ্যারে যা সূচকগুলি সহ অন্যান্য অ্যারের মতো হেরফের করা যায় etc.
যত্ন নিবেন.
আমি যেমন সবসময় বলি কিছুই অসম্ভব:
string value = "super exemple of string key : text I want to keep - end of my string";
Regex regex = new Regex(@"(key \: (.*?) _ )");
Match match = regex.Match(value);
if (match.Success)
{
Messagebox.Show(match.Value);
}
স্মরণকারী যা System.Text.RegularExpressions এর রেফারেন্স যুক্ত করে
আশা করি আমি সাহায্য করেছি।
প্রশ্নগুলি যখন একক উদাহরণের শর্তে বর্ণিত হয় তখন অস্পষ্টতা অবশ্যই উপস্থিত থাকে। এই প্রশ্ন ব্যতিক্রম নয়।
প্রশ্নে প্রদত্ত উদাহরণের জন্য পছন্দসই স্ট্রিংটি পরিষ্কার:
super example of string key : text I want to keep - end of my string
^^^^^^^^^^^^^^^^^^^
যাইহোক, এই স্ট্রিংটি কেবল স্ট্রিংস এবং সীমানা স্ট্রিংগুলির উদাহরণ যার জন্য নির্দিষ্ট সাবস্ট্রিংগুলি সনাক্ত করতে হবে। আমি জেনেরিক সীমানা স্ট্রিং সহ একটি জেনেরিক স্ট্রিং বিবেচনা করব, যা নীচে উপস্থাপন করা হয়েছে।
abc FF def PP ghi,PP jkl,FF mno PP pqr FF,stu FF vwx,PP yza
^^^^^^^^^^^^ ^^^^^
PPহয় পূর্ববর্তী স্ট্রিং , FFনিম্নলিখিত স্ট্রিং এবং পার্টি টুপি ইঙ্গিত যা, সাবস্ট্রিং মিলেছে করা হয়। (প্রশ্নে প্রদত্ত উদাহরণে key : পূর্ববর্তী স্ট্রিংটি এবং -এটি নিম্নোক্ত স্ট্রিং)) আমি ধরে নিয়েছি PPএবং FFএর আগে এবং শব্দের সীমাবদ্ধতা অনুসরণ করা হয় (যাতে PPAএবং FF8এটি মেলে না)।
আমার অনুমান যেমন পার্টির হাটগুলি দ্বারা প্রতিবিম্বিত হয়েছে তা নিম্নরূপ:
PPআগে একটি (বা আরও) FFসাবস্ট্রিংয়ের আগে থাকতে পারে , যা উপস্থিত থাকলে অবহেলা করা হয়;PPএক দ্বারা অনুসরণ করা হয় বা তার বেশি PPআগে গুলি FFসম্মুখীন করা হয়, নিম্নলিখিত PPগুলি পূর্ববর্তী এবং পরবর্তী স্ট্রিং মধ্যে সাবস্ট্রিং অংশ;PPএক বা একাধিক দ্বারা অনুসরণ করা হয় FFগুলি করার পূর্বে একটি PPএনকাউন্টার, প্রথম FFনিম্নলিখিত PPনিম্নলিখিত পংক্তি বলে মনে করা হয়।মনে রাখবেন যে এখানে অনেক উত্তর কেবলমাত্র ফর্মের স্ট্রিং নিয়ে কাজ করে
abc PP def FF ghi
^^^^^
বা
abc PP def FF ghi PP jkl FF mno
^^^^^ ^^^^^
আগ্রহের সাবস্ট্রিংগুলি সনাক্ত করতে কেউ একটি নিয়মিত প্রকাশ, কোড গঠন বা দুটির সংমিশ্রণ ব্যবহার করতে পারে। কোন পদ্ধতির মধ্যে সবচেয়ে ভাল তা আমি কোন রায় দিই না। আমি কেবল নিম্নলিখিত নিয়মিত প্রকাশটি উপস্থাপন করব যা আগ্রহের সাবস্ট্রিংয়ের সাথে মেলে।
(?<=\bPP\b)(?:(?!\bFF\b).)*(?=\bFF\b)
আমি এটি পিসিআরই (পিএইচপি) রেজেক্স ইঞ্জিন দিয়ে পরীক্ষা করেছিলাম, কিন্তু রেজেক্স মোটেও বহিরাগত নয় বলে আমি নিশ্চিত যে এটি .NET রেজেক্স ইঞ্জিনের সাথে কাজ করবে (যা খুব শক্তিশালী)।
রেজেক্স ইঞ্জিন নিম্নলিখিত ক্রিয়াকলাপ সম্পাদন করে:
(?<= : begin a positive lookbehind
\bPP\b : match 'PP'
) : end positive lookbehind
(?: : begin a non-capture group
(?! : begin a negative lookahead
\bFF\b : match 'FF'
) : end negative lookahead
. : match any character
) : end non-capture group
* : execute non-capture group 0+ times
(?= : begin positive lookahead
\bFF\b : match 'FF'
) : end positive lookahead
পূর্ববর্তী স্ট্রিং অনুসরণ করে একবারে একটি চরিত্রের সাথে মেলে এই কৌশলটি, যতক্ষণ না চরিত্রটি থাকে Fএবং তার অনুসরণ না করা হয় F(বা আরও সাধারণভাবে, চরিত্রটি নীচের স্ট্রিং গঠন করে এমন স্ট্রিং তৈরি করে), তাকে টেম্পার্ড লোভী টোকেন সলিউশন বলে ।
স্বাভাবিকভাবেই, আমি উপরে বর্ণিত অনুমানগুলি পরিবর্তন করা হলে রেজেক্সকে সংশোধন করতে হবে (সম্ভব হলে)।
1. বিস্তারিত ব্যাখ্যার জন্য কার্সারটিকে চারদিকে নিয়ে যান।
getStringBetween(startStr, endStr, fullStr) {
string startIndex = fullStr.indexOf(startStr);
string endIndex= fullStr.indexOf(endStr);
return fullStr.substring(startIndex + startStr.length, endIndex);
}
substringএবংindexof