ตัดแต่งอักขระตัวสุดท้ายจากสตริง


157

ฉันมีสายพูด

"Hello! world!" 

ฉันต้องการจะตัดหรือลบเพื่อนำออก! ออกจากโลก แต่ไม่ได้ปิดสวัสดี


1
อาจจะเกินคำขอของคุณ แต่ฉันขอให้คุณใช้เวลาคิดเกี่ยวกับการใช้ regex ฉันเสนอ?
Marcello Faga

1
ซ้ำซ้อนที่เป็นไปได้ของการลบอักขระตัวสุดท้ายของสตริง
Tor Klingberg

คำตอบ:


298
"Hello! world!".TrimEnd('!');

อ่านเพิ่มเติม

แก้ไข:

สิ่งที่ฉันสังเกตเห็นในคำถามประเภทนี้ที่ทุกคนแนะนำให้ลบอักขระสุดท้ายของสตริงที่กำหนด แต่นี่ไม่เป็นไปตามคำนิยามของวิธีการ Trim

ตัดแต่ง - ลบอักขระช่องว่างที่เกิดขึ้นทั้งหมดจากจุดเริ่มต้นและจุดสิ้นสุดของอินสแตนซ์นี้

MSDN-Trim

ภายใต้ข้อกำหนดนี้การลบเฉพาะอักขระตัวสุดท้ายออกจากสตริงเป็นการแก้ปัญหาที่ไม่ดี

ดังนั้นถ้าเราต้องการ "ตัดตัวอักขระสุดท้ายจากสตริง" เราควรทำอะไรแบบนี้

ตัวอย่างเช่นวิธีการขยาย:

public static class MyExtensions
{
  public static string TrimLastCharacter(this String str)
  {
     if(String.IsNullOrEmpty(str)){
        return str;
     } else {
        return str.TrimEnd(str[str.Length - 1]);
     }
  }
}

หมายเหตุหากคุณต้องการลบตัวละครทั้งหมดที่มีค่าเดียวกันนั่นคือ (!!!!) วิธีการข้างต้นจะลบการมีอยู่ทั้งหมดของ '! จากจุดสิ้นสุดของสตริง แต่ถ้าคุณต้องการลบเฉพาะอักขระตัวสุดท้ายคุณควรใช้:

else { return str.Remove(str.Length - 1); }

1
นี่จะดีกว่าตราบใดที่คุณรู้ว่าตัวละครตัวไหนที่คุณต้องการลบออกจากตอนท้ายของสตริง
Nimrod Shory

1
สวัสดี Vash คุณคิดอย่างไรเกี่ยวกับโซลูชันของฉันโดยใช้ RegEx มันตอบสนองคำขอของ Thqr และอนุญาตให้ลบ '!' ถ่านจาก "โลก!" expression วางนิพจน์ได้ทุกที่ในบรรทัดรหัสเดียว
Marcello Faga

24
-1 วิธีนี้จะลบอักขระที่ลงท้ายด้วยตัวเดียวกันทั้งหมด! เช่นจะเปลี่ยนเป็น "สวัสดี !!!!!!!!" เป็น "Hello" ซึ่งจะเป็นการลบอักขระที่เกินจากตัวสุดท้าย
Kugel

1
@ Kugel คุณมีสิทธิ์อย่างสมบูรณ์และนั่นเป็นเหตุผลที่คุณควรอ่านคำตอบของฉันอีกครั้ง สำหรับคำอธิบาย OP อย่าถามวิธีการลบตัวอักษรตัวสุดท้าย แต่จะตัดได้อย่างไร
Damian Leszczyński - Vash

1
@Vash - คุณจะลบคำพูดเดียวได้อย่างไร 'โดยใช้วิธีการ - "Hello! world!" TrimEnd ('! ');
Steam

65
String withoutLast = yourString.Substring(0,(yourString.Length - 1));

14
ตรวจสอบให้แน่ใจว่า yourString มีอักขระอย่างน้อย 1 ตัว
Nimrod Shory

ตรวจสอบให้แน่ใจว่าสตริงของคุณลงท้ายด้วยตัวละครที่คุณต้องการลบ EG: "Hello! World" จะกลายเป็น "Hello! Worl"
นาธานคูป

9
if (yourString.Length > 1)
    withoutLast = yourString.Substring(0, yourString.Length - 1);

หรือ

if (yourString.Length > 1)
    withoutLast = yourString.TrimEnd().Substring(0, yourString.Length - 1);

... ในกรณีที่คุณต้องการลบอักขระที่ไม่ใช่ช่องว่างออกจากท้ายที่สุด


9
ฉัน upvoted เป็นเพียงเพื่อชดเชย downvote โดยไม่ต้องแสดงความคิดเห็น เกลียดเมื่อคนอื่นทำ
Jeff Reddy

2
อาจเป็นเพราะไม่มีTrimEnd()วิธีการและหากมีก็อาจทำให้การSubstring(..)โทรที่ตามมาล้มเหลวในสตริงสั้น ๆ
โรรี่

7
        string s1 = "Hello! world!";
        string s2 = s1.Trim('!');

วิธีการทำงานกับคุณสมบัติ endswith ใช้ที่นี่ได้ไหม
userAZLogicApps

1
Trim () มีชื่อไม่ดี มันจดจ้องตัวละครนำและต่อท้าย (พหูพจน์) เช่นเดียวกับ TrimStart () และ TrimEnd ()
แอนโทนีบูธ



5

อีกตัวอย่างของการตัดแต่งอักขระตัวสุดท้ายจากสตริง:

string outputText = inputText.Remove(inputText.Length - 1, 1);

คุณสามารถใส่มันลงในวิธีการขยายและป้องกันมันจากสตริงโมฆะ ฯลฯ



2

คุณสามารถใช้สิ่งนี้:

public static class Extensions
 {

        public static string RemovePrefix(this string o, string prefix)
        {
            if (prefix == null) return o;
            return !o.StartsWith(prefix) ? o : o.Remove(0, prefix.Length);
        }

        public static string RemoveSuffix(this string o, string suffix)
        {
            if(suffix == null) return o;
            return !o.EndsWith(suffix) ? o : o.Remove(o.Length - suffix.Length, suffix.Length);
        }

    }


1

@Damian Leszczyńskiเวอร์ชั่นที่ได้รับการแก้ไขเล็กน้อย - Vash ที่จะทำให้แน่ใจว่าจะมีการลบเฉพาะอักขระที่เฉพาะเจาะจง

public static class StringExtensions
{
    public static string TrimLastCharacter(this string str, char character)
    {
        if (string.IsNullOrEmpty(str) || str[str.Length - 1] != character)
        {
            return str;
        }
        return str.Substring(0, str.Length - 1);
    }
}

0

ฉันใช้เส้นทางของการเขียนส่วนขยายโดยใช้ TrimEnd เพียงเพราะฉันใช้มันแบบอินไลน์และมีความสุขกับมัน ... เช่น:

static class Extensions
{
        public static string RemoveLastChars(this String text, string suffix)
        {            
            char[] trailingChars = suffix.ToCharArray();

            if (suffix == null) return text;
            return text.TrimEnd(trailingChars);
        }

}

ตรวจสอบให้แน่ใจว่าคุณรวมเนมสเปซในคลาสของคุณโดยใช้คลาสแบบคงที่ P และการใช้งานคือ:

string _ManagedLocationsOLAP = string.Empty;
_ManagedLocationsOLAP = _validManagedLocationIDs.RemoveLastChars(",");          

0

ตัวอย่างส่วนขยายคลาสเพื่อทำให้สิ่งนี้ง่ายขึ้น: -

internal static class String
{
    public static string TrimEndsCharacter(this string target, char character) => target?.TrimLeadingCharacter(character).TrimTrailingCharacter(character);
    public static string TrimLeadingCharacter(this string target, char character) => Match(target?.Substring(0, 1), character) ? target.Remove(0,1) : target;
    public static string TrimTrailingCharacter(this string target, char character) => Match(target?.Substring(target.Length - 1, 1), character) ? target.Substring(0, target.Length - 1) : target;

    private static bool Match(string value, char character) => !string.IsNullOrEmpty(value) && value[0] == character;
}

การใช้

"!Something!".TrimLeadingCharacter('X'); // Result '!Something!' (No Change)
"!Something!".TrimTrailingCharacter('S'); // Result '!Something!' (No Change)
"!Something!".TrimEndsCharacter('g'); // Result '!Something!' (No Change)

"!Something!".TrimLeadingCharacter('!'); // Result 'Something!' (1st Character removed)
"!Something!".TrimTrailingCharacter('!'); // Result '!Something' (Last Character removed)
"!Something!".TrimEndsCharacter('!'); // Result 'Something'  (End Characters removed)

"!!Something!!".TrimLeadingCharacter('!'); // Result '!Something!!' (Only 1st instance removed)
"!!Something!!".TrimTrailingCharacter('!'); // Result '!!Something!' (Only Last instance removed)
"!!Something!!".TrimEndsCharacter('!'); // Result '!Something!'  (Only End instances removed)

-5

หากคุณต้องการลบ '!' อักขระจากนิพจน์เฉพาะ ("โลก" ในกรณีของคุณ) จากนั้นคุณสามารถใช้นิพจน์ทั่วไปนี้

string input = "Hello! world!";

string output = Regex.Replace(input, "(world)!", "$1", RegexOptions.Multiline | RegexOptions.Singleline);

// result: "Hello! world"

อักขระพิเศษ $ 1 ประกอบด้วยนิพจน์ "โลก" ที่ตรงกันทั้งหมดและใช้เพื่อแทนที่ "โลก!" ดั้งเดิม การแสดงออก

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.