จะลบบรรทัดใหม่จากจุดเริ่มต้นและจุดสิ้นสุดของสตริงได้อย่างไร?


129

ฉันมีสตริงที่มีข้อความตามด้วยบรรทัดว่าง วิธีใดที่ดีที่สุดในการเก็บส่วนที่มีข้อความ แต่ลบช่องว่างขึ้นบรรทัดใหม่จากท้าย



1
ไม่มันไม่ใช่. คำถามในลิงค์กำลังถามเกี่ยวกับ 'แทนที่' มากกว่า ..
Faiz

คำตอบ:


279

ใช้String.trim()วิธีการกำจัดช่องว่าง (เว้นวรรคบรรทัดใหม่ ฯลฯ ) จากจุดเริ่มต้นและจุดสิ้นสุดของสตริง

String trimmedString = myString.trim();

18
คำถามเกี่ยวกับการขึ้นบรรทัดใหม่ สิ่งนี้ลบมากกว่าการขึ้นบรรทัดใหม่
mmm

21
String.replaceAll("[\n\r]", "");

14
Bro, @JohnB มันจะลบอักขระบรรทัดใหม่ทั้งหมดที่อยู่ระหว่างสตริงด้วย การถามคือการลบเฉพาะอักขระบรรทัดใหม่ที่นำหน้าและต่อท้าย
สิทธารถะ

5

TL; DR

String cleanString = dirtyString.strip() ; // Call new `String::string` method.

String::strip…

เก่าString::trimวิธีการมีความหมายที่แปลกของช่องว่าง

ตามที่กล่าวไว้ที่นี่ Java 11 จะเพิ่มstrip…วิธีการใหม่ให้กับStringคลาส สิ่งเหล่านี้ใช้คำจำกัดความของช่องว่างที่เข้าใจ Unicode มากขึ้น Character::isWhitespaceดูกฎของคำนิยามนี้ในชั้นเรียนสำหรับ JavaDoc

ตัวอย่างรหัส

String input = " some Thing ";
System.out.println("before->>"+input+"<<-");
input = input.strip();
System.out.println("after->>"+input+"<<-");

หรือคุณจะตัดช่องว่างนำหน้าหรือแค่ช่องว่างต่อท้ายก็ได้

คุณไม่ได้ระบุว่าจุดรหัสใดประกอบเป็นบรรทัดใหม่ของคุณ ฉันคิดว่าบรรทัดใหม่ของคุณน่าจะรวมอยู่ในรายการจุดรหัสที่กำหนดเป้าหมายโดยstrip:

  • เป็นอักขระช่องว่าง Unicode (SPACE_SEPARATOR, LINE_SEPARATOR หรือ PARAGRAPH_SEPARATOR) แต่ไม่ใช่ช่องว่างที่ไม่ทำลาย ('\ u00A0', '\ u2007', '\ u202F')
  • มันคือ '\ t', U + 0009 HORIZONTAL TABULATION
  • มันคือ '\ n', U + 000A LINE FEED
  • มันคือ '\ u000B', U + 000B VERTICAL TABULATION
  • มันคือ '\ f', U + 000C FORM FEED
  • มันคือ '\ r', U + 000D CARRIAGE RETURN
  • มันคือ '\ u001C', U + 001C FILE SEPARATOR
  • มันคือ "\ u001D", U + 001D GROUP SEPARATOR
  • มันคือ "\ u001E", U + 001E RECORD SEPARATOR
  • มันคือ '\ u001F', U + 0

4

โค้ด Java นี้ทำตามที่ถามในหัวข้อคำถามนั่นคือ "ลบบรรทัดใหม่จากจุดเริ่มต้นและจุดสิ้นสุดของ string-java":

String.replaceAll("^[\n\r]", "").replaceAll("[\n\r]$", "")

ลบบรรทัดใหม่จากท้ายบรรทัดเท่านั้น:

String.replaceAll("[\n\r]$", "")

ลบบรรทัดใหม่จากจุดเริ่มต้นของบรรทัดเท่านั้น:

String.replaceAll("^[\n\r]", "")

คุณช่วยระบุบริบทเพิ่มเติมให้กับคำตอบของคุณได้ไหม วิธีนี้ทำให้ทุกคนเข้าใจว่าโค้ดของคุณใช้ทำอะไรและทำไม
Mariano Zorrilla

ฉันได้เพิ่มคำอธิบายในคำตอบของฉันแล้ว หวังว่าตอนนี้คงกระจ่างแล้ว
Alexander Samoylov


1
String trimStartEnd = "\n TestString1 linebreak1\nlinebreak2\nlinebreak3\n TestString2 \n";
System.out.println("Original String : [" + trimStartEnd + "]");
System.out.println("-----------------------------");
System.out.println("Result String : [" + trimStartEnd.replaceAll("^(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])|(\\r\\n|[\\n\\x0B\\x0C\\r\\u0085\\u2028\\u2029])$", "") + "]");
  1. จุดเริ่มต้นของสตริง = ^,
  2. จุดสิ้นสุดของสตริง = $,
  3. การรวม regex = | ,
  4. Linebreak = \ r \ n | [\ n \ x0B \ x0C \ r \ u0085 \ u2028 \ u2029]

1

หากคุณต้องการลบตัวแบ่งบรรทัด (ไม่ใช่ช่องว่างแท็บ) ที่จุดเริ่มต้นและจุดสิ้นสุดของสตริง (ไม่ใช่ระหว่างกัน) คุณสามารถใช้วิธีนี้:

ใช้นิพจน์ทั่วไปเพื่อลบการส่งคืนค่าขนส่ง ( \\r) และฟีดบรรทัด ( \\n) จากจุดเริ่มต้น ( ^) และสิ้นสุด ( $) ของสตริง:

 s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "")

ตัวอย่างที่สมบูรณ์:

public class RemoveLineBreaks {
    public static void main(String[] args) {
        var s = "\nHello\nWorld\n";
        System.out.println("before: >"+s+"<");
        s = s.replaceAll("(^[\\r\\n]+|[\\r\\n]+$)", "");
        System.out.println("after: >"+s+"<");
    }
}

มันส่งออก:

before: >
Hello
World
<
after: >Hello
World<

0

ฉันจะเพิ่มคำตอบสำหรับสิ่งนี้เช่นกันเพราะในขณะที่ฉันมีคำถามเดียวกันคำตอบที่ให้มาก็ไม่เพียงพอ เมื่อพิจารณาถึงความคิดฉันก็ตระหนักว่าสิ่งนี้สามารถทำได้อย่างง่ายดายด้วยการแสดงออกปกติ

ในการลบขึ้นบรรทัดใหม่จากจุดเริ่มต้น:

// Trim left
String[] a = "\n\nfrom the beginning\n\n".split("^\\n+", 2);

System.out.println("-" + (a.length > 1 ? a[1] : a[0]) + "-");

และจุดสิ้นสุดของสตริง:

// Trim right
String z = "\n\nfrom the end\n\n";

System.out.println("-" + z.split("\\n+$", 2)[0] + "-");

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

โปรดทราบว่าวิธีเดียวกันนี้สามารถทำได้ในการตัดแต่งรูปแบบและการรวมกันของอักขระจากปลายทั้งสองข้างเนื่องจากเป็นนิพจน์ทั่วไป


ใช่ แต่ถ้าคุณไม่รู้ว่ามีกี่บรรทัดที่จุดเริ่มต้น / สิ้นสุด? วิธีแก้ปัญหาของคุณถือว่ามีบรรทัดใหม่ 2 บรรทัดในทั้งสองกรณี
Luka Govedič

พารามิเตอร์ที่สองsplit()เป็นเพียงขีด จำกัด ปล่อยทิ้งไว้หากคุณต้องการจับคู่ไม่ จำกัด จำนวนครั้ง
Zhro


-3
String text = readFileAsString("textfile.txt");
text = text.replace("\n", "").replace("\r", "");

2
สิ่งนี้ไม่สามารถตอบคำถามได้อย่างถูกต้อง มันจะลบ CR และ LF ทั้งหมดไม่ใช่เฉพาะที่จุดเริ่มต้นและจุดสิ้นสุด
james.garriss

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