แทนที่ตัวแบ่งบรรทัดในสตริง C #


512

ฉันจะแทนที่ Line Breaks ภายในสตริงใน C # ได้อย่างไร


2
โปรดบอกเราเพิ่มเติม: "ตัวแบ่งบรรทัด" สำหรับคุณคืออะไร คุณต้องการแทนที่ด้วยอะไร
Jay Bazuzi

ฮ่า. ฉันกำลังตรวจสอบสิ่งเดียวกันในภาษาจาวาเมื่อฉันพบว่า System.getProperty ("line.separator") เป็นสิ่งที่อยากรู้ใน C # โพสต์ของคุณช่วยฉัน
Ravisha

คำตอบ:


715

ใช้แทนที่ด้วย Environment.NewLine

myString = myString.Replace(System.Environment.NewLine, "replacement text"); //add a line terminating ;

เป็นที่กล่าวถึงในบทความอื่น ๆ ถ้าสตริงมาจากสภาพแวดล้อมอื่น (OS) แล้วคุณจะต้องแทนที่ว่าสภาพแวดล้อมโดยเฉพาะอย่างยิ่งการดำเนินงานของการควบคุมตัวอักษรบรรทัดใหม่


8
ก่อนอื่นมันไม่ทำงานสำหรับฉัน หลังจากการวิจัยบางอย่างฉันพบวิธีแก้ปัญหา: ฉันต้องใช้ 'using System;' หรือ 'System.Environment.NewLine'
Smolla

12
ไม่ได้ลบตัวอักษรขึ้นบรรทัดใหม่ทั้งหมด ลองใช้สตริงนี้"\ n \ r \ n ข้อความของฉัน \ r \ n \ n \ r \ n คือนี่ \ n \ n \ r \ n"
Shakti Prakash Singh

13
โดยทั่วไปแล้วฉันชอบวิธีนี้ อย่างไรก็ตามโปรดทราบว่าแม้ในระบบปฏิบัติการเดียวกันบรรทัดใหม่จริงอาจไม่ตรงกัน เรื่องนี้เกิดขึ้นกับฉันทำไมการประมวลผลส่งคืน SQL บรรทัดใหม่คือ \ n ในขณะที่สภาพแวดล้อมบรรทัดใหม่คือ \ r \ n ผลลัพธ์ก็คือไม่มีอะไรที่เข้าคู่กันดังนั้นเส้นใหม่ยังคงอยู่
Dono

@Dono> ข้อมูล SQL มาจากไหน อาจมาจากแหล่งภายนอกจัดการกับบรรทัดใหม่ด้วยวิธี UNIX นั่นคือปัญหาที่มีรูปแบบข้อมูลไม่ได้กับระบบปฏิบัติการหรือวิธีการนี้ ...
Laurent เอส

นี่ควรเป็นหนึ่งในวิธีการคงที่ของคลาส String . NET เองควรจะสามารถตรวจจับรูปแบบของตัวแบ่งบรรทัดซอร์สในสตริงและแปลงเป็นรูปแบบ Environment.NewLine \ r \ n ...
Dean Kuga

442

วิธีแก้ไขปัญหาที่โพสต์จนถึงการแทนที่เท่านั้นEnvironment.NewLineหรือล้มเหลวหากสตริงการแทนที่มีตัวแบ่งบรรทัดเนื่องจากพวกเขาเรียกstring.Replaceหลายครั้ง

นี่คือโซลูชันที่ใช้นิพจน์ทั่วไปเพื่อสร้างการแทนที่ทั้งสามด้วยการส่งผ่านสายเดียว ซึ่งหมายความว่าสตริงการแทนที่สามารถมีตัวแบ่งบรรทัดได้อย่างปลอดภัย

string result = Regex.Replace(input, @"\r\n?|\n", replacementString);

3
ดังนั้นการพูดของคุณกำลังทำ Regex.Replace (input, @ "[\ r \ n] +", replaceString) จะไม่ทำงานเหมือนเดิม?
flamebaud

7
@flamebaud ไม่ว่าจะให้ผลลัพธ์ที่แตกต่างหากมีหลายตัวแบ่งบรรทัดในแถว "\ r \ n? | \ n" จะแทนที่แต่ละตัวแบ่งบรรทัดในขณะที่ "[\ r \ n] +" จะทำการแทนที่เดียวสำหรับจำนวนของตัวแบ่งบรรทัดใด ๆ
David Hammond

สำหรับผู้ที่กังวลเกี่ยวกับการขึ้นบรรทัดใหม่หลายครั้ง: / (\ r \ n? | \ n) / gm
BobbyA

4
นี่เป็นทางออกที่ถูกต้องหากคุณต้องการลบตัวแบ่งบรรทัดในสตริงที่อาจมาจากระบบปฏิบัติการอื่น ตัวอย่างที่ดีคือการจัดรูปแบบ JSON +1
Bastien Vandamme

1
หากไม่ใช้สตริงคำต่อคำ (@ คำนำหน้า) คุณจะต้องมีเครื่องหมายแบ็กสแลชสองตัวติดกันทุกแถวที่ใช้ดังนั้นคำตอบจาก @mark_byers ด้านบนจะยังคงถูกต้อง คำนำหน้า @ ทำเพื่อให้แบ็กสแลชเป็นส่วนหนึ่งของสตริงซึ่งจะต้องใช้สำหรับ Regex เพื่อใช้เป็นอักขระยกเว้น
Kirk Liemohn

173

เพื่อขยายคำตอบของ The.Anyi.9 คุณควรระวังการแตกบรรทัดในการใช้งานทั่วไปด้วย ขึ้นอยู่กับแหล่งที่มาของไฟล์ของคุณคุณอาจต้องการตรวจสอบให้แน่ใจว่าคุณได้พบกับทางเลือกทั้งหมด ...

string replaceWith = "";
string removedBreaks = Line.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);

คุณควรจะไป ...


6
ครั้งแรกที่ฉันชอบสิ่งที่สภาพแวดล้อมดีขึ้น แต่ถ้า String ไม่ได้มาจากระบบมันทำงานอยู่มันจะไม่ทำงาน +1
Flo

1
ยังไม่Line.Replace("\n", replaceWith).Replace("\r", replaceWith);พอ
โทมัส Ayoub

5
ไม่เพราะถ้าคุณมี\r\nคุณจะจบลงด้วยสตริงการเปลี่ยนสองครั้ง - ไม่เหมาะ
ZombieSheep

1
คุณไม่ต้องการตัวอักษรสตริง? สตริงที่ถูกลบBreaks = Line.Replace (@ "\ r \ n", replaceWith). แทนที่ (@ "\ n", replaceWith). แทนที่ (@ "\ r", replaceWith);
Shawn Dotey

2
@ShawnDotey ไม่จำเป็นเราต้องการแทนที่อักขระควบคุมไม่ใช่ลำดับของแบ็กสแลชและตัวอักษร
N. Kudryavtsev

38

ฉันจะใช้ Environment.Newline เมื่อฉันต้องการแทรก newline สำหรับสตริง แต่ไม่ลบบรรทัดใหม่ทั้งหมดออกจากสตริง

ขึ้นอยู่กับแพลตฟอร์มของคุณคุณสามารถมีการขึ้นบรรทัดใหม่ประเภทต่าง ๆ ได้แม้ในแพลตฟอร์มเดียวกันบ่อยครั้งที่การขึ้นบรรทัดใหม่นั้นใช้ โดยเฉพาะเมื่อจัดการกับรูปแบบไฟล์และโปรโตคอล

string ReplaceNewlines(string blockOfText, string replaceWith)
{
    return blockOfText.Replace("\r\n", replaceWith).Replace("\n", replaceWith).Replace("\r", replaceWith);
}

นี่เป็นสิ่งเดียวที่ทำงานสำหรับฉันเมื่อฉันต้องการยุบรหัสเว็บเพจที่ดึงมาเป็นบรรทัดเดียว (เพื่อทำให้รูปแบบ regex ง่ายขึ้น)
Paw Baltzersen

เห็นด้วยทั้งหมดกับ Brian R. Bondy วิธีแก้ปัญหาที่ Corin นำเสนอและ upvoted มากนั้นไร้เดียงสาอย่างน้อยที่สุด
Califf

18

หากรหัสของคุณควรทำงานในสภาพแวดล้อมที่แตกต่างกันฉันจะพิจารณาใช้Environment.NewLineค่าคงที่เนื่องจากเป็นรหัสเฉพาะที่newlineใช้ในสภาพแวดล้อมเฉพาะ

line = line.Replace(Environment.NewLine, "newLineReplacement");

อย่างไรก็ตามหากคุณได้รับข้อความจากไฟล์ที่มาจากระบบอื่นนี่อาจไม่ใช่คำตอบที่ถูกต้องและคุณควรแทนที่ด้วยค่าคงที่บรรทัดใหม่ที่ใช้ในระบบอื่น ซึ่งโดยปกติจะเป็นหรือ\n\r\n


คุณต้องกำหนดค่ากลับไปเป็นตัวแปรดั้งเดิมเนื่องจากการแทนที่ไม่เกิดขึ้น
tvanfosson

@driss ฉันอยากจะรู้ว่าคุณจะเลือกค่าคงที่ของบรรทัดใหม่ที่ถูกต้องได้อย่างไรเมื่อคุณไม่ทราบว่าไฟล์มาจากไหน ... โซลูชันนี้น่าจะเป็น UNIVERSAL
Califf

14

อย่าลืมว่าการแทนที่ไม่ได้ทำการแทนที่ในสตริง แต่ส่งคืนสตริงใหม่ด้วยอักขระที่ถูกแทนที่ ต่อไปนี้จะลบตัวแบ่งบรรทัด (ไม่แทนที่) ฉันจะใช้วิธีการ @Brian R. Bondy หากแทนที่ด้วยวิธีอื่นอาจใช้วิธีการต่อเติม อย่าลืมตรวจสอบค่าว่างก่อนโทรแทนที่หรือวิธีการขยายให้

string line = ...

line = line.Replace( "\r", "").Replace( "\n", "" );

เป็นวิธีการขยาย:

public static class StringExtensions
{
   public static string RemoveLineBreaks( this string lines )
   {
      return lines.Replace( "\r", "").Replace( "\n", "" );
   }

   public static string ReplaceLineBreaks( this string lines, string replacement )
   {
      return lines.Replace( "\r\n", replacement )
                  .Replace( "\r", replacement )
                  .Replace( "\n", replacement );
   }
}

ไม่สามารถมี''ใน C # ได้ - ไม่มีสิ่งใดเป็นถ่านเปล่า จะ'\0'ทำงานแทนไหม
Shevek

1
@hevek - เพียงแค่ใช้คำพูดที่ไม่ถูกต้อง ต้องใช้จาวาสคริปต์ในปริมาณที่พอสมควรในวันที่ฉันตอบคำถามนี้
tvanfosson

@ Califf - มันเทียบเท่าไม่ดีกว่า
tvanfosson

2
ความผิดพลาดที่คุณทำที่นี่เพียงพิสูจน์ว่าดีกว่า บริษัท ส่วนใหญ่ที่ฉันทำงานเพื่อให้เป็นมาตรฐานการเข้ารหัสของพวกเขา - ห้ามใช้วรรณกรรมที่มีเนื้อหาหยาบ
Califf

2
@ หน้าผา "ความผิดพลาด" ที่ฉันทำขึ้นมาจะไม่ได้ทำใน IDE ด้วย Intellisense และจะไม่ได้รวบรวมไว้ หากคุณรู้สึกว่าstring.Emptyดีขึ้นโดยทั้งหมดใช้มัน
tvanfosson

10

เพื่อให้แน่ใจว่าวิธีที่เป็นไปได้ทั้งหมดของการแบ่งบรรทัด (Windows, Mac และ Unix) จะถูกแทนที่คุณควรใช้:

string.Replace("\r\n", "\n").Replace('\r', '\n').Replace('\n', 'replacement');

และในคำสั่งนี้เพื่อไม่ให้มีการแบ่งบรรทัดพิเศษเมื่อคุณพบการรวมกันของตัวอักษรสิ้นสุดบรรทัด


8

ถ้าคุณต้องการที่จะ "ทำความสะอาด" บรรทัดใหม่ความคิดเห็น Flamebaud โดยใช้ regex @"[\r\n]+"เป็นตัวเลือกที่ดีที่สุด

using System;
using System.Text.RegularExpressions;

class MainClass {
  public static void Main (string[] args) {
    string str = "AAA\r\nBBB\r\n\r\n\r\nCCC\r\r\rDDD\n\n\nEEE";

    Console.WriteLine (str.Replace(System.Environment.NewLine, "-"));
    /* Result:
    AAA
    -BBB
    -
    -
    -CCC


    DDD---EEE
    */
    Console.WriteLine (Regex.Replace(str, @"\r\n?|\n", "-"));
    // Result:
    // AAA-BBB---CCC---DDD---EEE

    Console.WriteLine (Regex.Replace(str, @"[\r\n]+", "-"));
    // Result:
    // AAA-BBB-CCC-DDD-EEE
  }
}

คำตอบที่ดีที่สุดในการแทนที่บรรทัดใหม่สำหรับกรณีส่วนใหญ่
Shahbaz Ahmad

ขอบคุณสำหรับโค้ดตัวอย่างที่มีประโยชน์นี้ ฉันได้รับการแก้ไขผ่าน sytnax นี้: Regex.Replace (str, @ "[\ r \ n] +", "-")
Sedat Kumcu

6

ฉันต้องการแทนที่\r\nด้วยค่าขนส่งคืนจริงและป้อนบรรทัดและแทนที่\tด้วยแท็บจริง ดังนั้นฉันจึงคิดสิ่งต่อไปนี้:

public string Transform(string data)
{
    string result = data;
    char cr = (char)13;
    char lf = (char)10;
    char tab = (char)9;

    result = result.Replace("\\r", cr.ToString());
    result = result.Replace("\\n", lf.ToString());
    result = result.Replace("\\t", tab.ToString());

    return result;
}

6

ทำไมไม่ทั้งสองล่ะ

string ReplacementString = "";

Regex.Replace(strin.Replace(System.Environment.NewLine, ReplacementString), @"(\r\n?|\n)", ReplacementString);

หมายเหตุ:แทนที่strinด้วยชื่อของสายป้อนของคุณ




2

วิธีที่ดีที่สุดในการเปลี่ยน linebreaks อย่างปลอดภัยคือ

yourString.Replace("\r\n","\n") //handling windows linebreaks
.Replace("\r","\n")             //handling mac linebreaks

ที่ควรสร้างสตริงที่มีเฉพาะ \ n (เช่น linefeed) เป็นการแบ่งบรรทัด รหัสนี้มีประโยชน์ในการแก้ไข linebreaks ผสมเช่นกัน


2

ในฐานะที่เป็นสายใหม่ที่สามารถคั่นด้วย\n, \rและ\r\nเป็นครั้งแรกที่เราจะแทนที่\rและ\r\nมี\nและมีเพียงข้อมูลสตริงแล้วแยก

บรรทัดต่อไปนี้ควรไปที่parseCSVวิธีการ:

function parseCSV(data) {
    //alert(data);
    //replace UNIX new lines
    data = data.replace(/\r\n/g, "\n");
    //replace MAC new lines
    data = data.replace(/\r/g, "\n");
    //split into rows
    var rows = data.split("\n");
}

0
string s = Regex.Replace(source_string, "\n", "\r\n");

หรือ

string s = Regex.Replace(source_string, "\r\n", "\n");

ขึ้นอยู่กับว่าคุณต้องการไปทางไหน

หวังว่ามันจะช่วย


0

ตัวเลือกอื่นคือการสร้างข้อความที่มีStringReaderปัญหา บนเครื่องอ่านทำ.ReadLine()แบบวนซ้ำ จากนั้นคุณมีบรรทัดที่แยกจากกันไม่ว่าตัวคั่น (ที่สอดคล้องหรือไม่สอดคล้องกัน) จะมีอะไร ด้วยสิ่งนี้คุณสามารถดำเนินการตามที่คุณต้องการ; ความเป็นไปได้อย่างหนึ่งคือการใช้StringBuilderและเรียก.AppendLineมัน

ข้อดีคือคุณปล่อยให้กรอบงานตัดสินใจว่าอะไรคือ "ตัวแบ่งบรรทัด"


0

หากคุณต้องการแทนที่เฉพาะบรรทัดใหม่:

var input = @"sdfhlu \r\n sdkuidfs\r\ndfgdgfd";
var match = @"[\\ ]+";
var replaceWith = " ";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input.Replace(@"\n", replaceWith).Replace(@"\r", replaceWith), match, replaceWith);
Console.WriteLine("output: " + x);

หากคุณต้องการแทนที่บรรทัดใหม่แท็บและช่องว่างสีขาว:

var input = @"sdfhlusdkuidfs\r\ndfgdgfd";
var match = @"[\\s]+";
var replaceWith = "";
Console.WriteLine("input: " + input);
var x = Regex.Replace(input, match, replaceWith);
Console.WriteLine("output: " + x);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.