substring
Diğerinden en sağdaki altı harften oluşan a'yı nasıl çıkarabilirim string
?
Ör: benim dizem "PER 343573"
. Şimdi sadece çıkarmak istiyorum "343573"
.
Bunu nasıl yapabilirim?
string endOfString = Strings.Right(wholeString, 6);
substring
Diğerinden en sağdaki altı harften oluşan a'yı nasıl çıkarabilirim string
?
Ör: benim dizem "PER 343573"
. Şimdi sadece çıkarmak istiyorum "343573"
.
Bunu nasıl yapabilirim?
string endOfString = Strings.Right(wholeString, 6);
Yanıtlar:
string SubString = MyString.Substring(MyString.Length-6);
Right(n);
İşlevi ifade etmek için bir uzatma yöntemi yazın . İşlev, boş bir dize döndüren boş veya boş dizelerle, orijinal dizeyi döndüren maksimum uzunluktan daha kısa dizelerle ve en sağdaki karakterlerin maksimum uzunluğunu döndüren maksimum uzunluktan daha uzun dizelerle ilgilenmelidir.
public static string Right(this string sValue, int iMaxLength)
{
//Check if the value is valid
if (string.IsNullOrEmpty(sValue))
{
//Set valid empty string as string could be null
sValue = string.Empty;
}
else if (sValue.Length > iMaxLength)
{
//Make the string no longer than the max length
sValue = sValue.Substring(sValue.Length - iMaxLength, iMaxLength);
}
//Return the string
return sValue;
}
sValue.Length > iMaxLength
Bir alt dize çağrılmadan önceki gibi olmayacak !
Bir uzatma yöntemi kullanmak muhtemelen daha hoş:
public static class StringExtensions
{
public static string Right(this string str, int length)
{
return str.Substring(str.Length - length, length);
}
}
kullanım
string myStr = "PER 343573";
string subStr = myStr.Right(6);
str.Length - length
negatif olabilir. Ayrıca ikinci parametre isteğe bağlıdır. Uzunluğu geçmeye gerek yok.
using System;
public static class DataTypeExtensions
{
#region Methods
public static string Left(this string str, int length)
{
str = (str ?? string.Empty);
return str.Substring(0, Math.Min(length, str.Length));
}
public static string Right(this string str, int length)
{
str = (str ?? string.Empty);
return (str.Length >= length)
? str.Substring(str.Length - length, length)
: str;
}
#endregion
}
Hata olmamalı, boş dizge olarak null döndürür, kesilmiş veya temel değerleri döndürür. "Testx" .Left (4) veya str.Right (12) gibi kullanın;
dizenizin uzunluğundan emin değilseniz, ancak kelimelerin sayıldığından eminseniz (bu durumda her zaman 2 kelime, 'xxx yyyyyy' gibi) bölmeyi kullansanız iyi olur.
string Result = "PER 343573".Split(" ")[1];
bu her zaman dizenizin ikinci kelimesini döndürür.
Bu tam olarak istediğiniz şey değil, ancak sadece örneğe bakınca, dizenin sayısal bölümünü aradığınız anlaşılıyor.
Bu her zaman böyleyse, bunu yapmanın iyi bir yolu düzenli ifade kullanmaktır.
var regex= new Regex("\n+");
string numberString = regex.Match(page).Value;
Gereksinimlerinizi tahmin etmek, ancak aşağıdaki normal ifade, dizenin sonundan önce yalnızca 6 alfanümerik sonuç verir ve aksi takdirde eşleşme olmaz.
string result = Regex.Match("PER 343573", @"[a-zA-Z\d]{6}$").Value;
Eğer tüm derler .NET, kullandığımız için MSIL , sadece referans Microsoft.VisualBasic ve kullanmak Microsoft'un yerleşik Strings.Right
yöntemiyle :
using Microsoft.VisualBasic;
...
string input = "PER 343573";
string output = Strings.Right(input, 6);
Özel bir uzatma yöntemi veya başka bir çalışma oluşturmanıza gerek yok. Sonuç, bir referans ve tek bir basit kod satırı ile elde edilir.
Bununla ilgili daha fazla bilgi olarak, C # ile Visual Basic yöntemlerinin kullanılması başka yerlerde belgelenmiştir . Ben şahsen bir dosyayı ayrıştırmaya çalışırken ilk önce tökezledim ve bu SO iş parçacığınınMicrosoft.VisualBasic.FileIO.TextFieldParser
sınıfı kullanarak .csv dosyalarını ayrıştırmak için son derece yararlı olduğunu gördüm.
var str = "PER 343573";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty
: str.Length < 6 ? str
: str.Substring(str.Length - 6); // "343573"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "343573"
bu str
,. alternatif kod null
dizeyi desteklemez . ve birincisi daha hızlı ve ikincisi daha kompakt.
str
İçeren kısa diziyi biliyorsanız ikincisini tercih ederim . uzun bir ip ise ilki daha uygundur.
Örneğin
var str = "";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty
: str.Length < 6 ? str
: str.Substring(str.Length - 6); // ""
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // ""
veya
var str = "123";
var right6 = string.IsNullOrWhiteSpace(str) ? string.Empty
: str.Length < 6 ? str
: str.Substring(str.Length - 6); // "123"
// alternative
var alt_right6 = new string(str.Reverse().Take(6).Reverse().ToArray()); // "123"
Boş Güvenli Yöntemler:
Orijinal dizeyi döndüren maksimum uzunluktan daha kısa dizeler
Dize Sağ Uzantı Yöntemi
public static string Right(this string input, int count) =>
String.Join("", (input + "").ToCharArray().Reverse().Take(count).Reverse());
Dize Sol Uzantı Yöntemi
public static string Left(this string input, int count) =>
String.Join("", (input + "").ToCharArray().Take(count));
İşte kullandığım çözüm ... Girdi dizesinin uzunluğunun istenen uzunluktan düşük olmadığını kontrol ediyor. Yukarıda gördüğüm çözümler maalesef bunu dikkate almıyor - bu da çökmelere neden olabilir.
/// <summary>
/// Gets the last x-<paramref name="amount"/> of characters from the given string.
/// If the given string's length is smaller than the requested <see cref="amount"/> the full string is returned.
/// If the given <paramref name="amount"/> is negative, an empty string will be returned.
/// </summary>
/// <param name="string">The string from which to extract the last x-<paramref name="amount"/> of characters.</param>
/// <param name="amount">The amount of characters to return.</param>
/// <returns>The last x-<paramref name="amount"/> of characters from the given string.</returns>
public static string GetLast(this string @string, int amount)
{
if (@string == null) {
return @string;
}
if (amount < 0) {
return String.Empty;
}
if (amount >= @string.Length) {
return @string;
} else {
return @string.Substring(@string.Length - amount);
}
}
Kullandığım yöntem bu: İşleri basit tutmayı seviyorum.
private string TakeLast(string input, int num)
{
if (num > input.Length)
{
num = input.Length;
}
return input.Substring(input.Length - num);
}
Sadece bir düşünce:
public static string Right(this string @this, int length) {
return @this.Substring(Math.Max(@this.Length - length, 0));
}
//s - your string
//n - maximum number of right characters to take at the end of string
(new Regex("^.*?(.{1,n})$")).Replace(s,"$1")
Bit dönüştürücüye ve bit kaydırmaya başvurmadan (kodlamadan emin olmak gerekir) bu, 'Sağ' genişletme yöntemi olarak kullandığım en hızlı yöntemdir.
string myString = "123456789123456789";
if (myString > 6)
{
char[] cString = myString.ToCharArray();
Array.Reverse(myString);
Array.Resize(ref myString, 6);
Array.Reverse(myString);
string val = new string(myString);
}
Array.Reverse
bir dizi değil, bir dizi alır ve if (myString.length > 6)
. Sözdizimi hataları bir yana, bu neden en hızlı yöntem olsun? Elbette sadece alt dizeyi kullanmak daha iyi bir yol olurdu, dizilerin tüm bu kopyalanmasını gerektirmez.
Negatif durumları önlemek ve aynı zamanda boş dizeleri işlemek için Min'i kullanıyorum
// <summary>
/// Returns a string containing a specified number of characters from the right side of a string.
/// </summary>
public static string Right(this string value, int length)
{
string result = value;
if (value != null)
result = value.Substring(0, Math.Min(value.Length, length));
return result;
}
using Microsoft.visualBasic;
public class test{
public void main(){
string randomString = "Random Word";
print (Strings.right(randomString,4));
}
}
çıktı "Word" dür