แยกสตริงออกเป็นประโยคโดยใช้นิพจน์ทั่วไป

ฉันต้องจับคู่สตริงเช่น "หนึ่ง สอง สาม สี่ ห้า หก เจ็ด แปด เก้า สิบ สิบเอ็ด" เป็นกลุ่มละสี่ประโยค ฉันต้องการนิพจน์ทั่วไปเพื่อแบ่งสตริงออกเป็นกลุ่มหลังจากทุกช่วงที่สี่ สิ่งที่ต้องการ:

  string regex = @"(.*.\s){4}";

  System.Text.RegularExpressions.Regex exp = new System.Text.RegularExpressions.Regex(regex);

  string result = exp.Replace(toTest, ".\n");

ใช้งานไม่ได้เนื่องจากจะแทนที่ข้อความก่อนจุด ไม่ใช่แค่จุดเท่านั้น ฉันจะนับเฉพาะจุดและแทนที่ด้วยจุดและอักขระขึ้นบรรทัดใหม่ได้อย่างไร


person Tai Squared    schedule 28.10.2008    source แหล่งที่มา


คำตอบ (6)


. ใน regex หมายถึง "อักขระใดๆ"

ดังนั้นใน regex ของคุณ คุณได้ใช้ .*. ซึ่งจะจับคู่คำ (ซึ่งเทียบเท่ากับ .+)

คุณอาจกำลังมองหา [^.]\*[.] ซึ่งเป็นชุดอักขระที่ไม่มี "." ตามด้วย "."

person Oliver Hallam    schedule 28.10.2008

ลองกำหนดวิธีการ

private string AppendNewLineToMatch(Match match) {
    return match.Value + Environment.NewLine;
}

และใช้

string result = exp.Replace(toTest, AppendNewLineToMatch);

สิ่งนี้ควรเรียกเมธอดสำหรับการจับคู่แต่ละรายการ และแทนที่ด้วยผลลัพธ์ของเมธอดนั้น ผลลัพธ์ของวิธีนี้คือข้อความที่ตรงกันและการขึ้นบรรทัดใหม่


แก้ไข: ฉันเห็นด้วยกับโอลิเวอร์ด้วย คำจำกัดความ regex ที่ถูกต้องควรเป็น:

  string regex = @"([^.]*[.]\s*){4}";

การแก้ไขอื่น: แก้ไข regex หวังว่าครั้งนี้ฉันจะทำให้ถูกต้อง

person configurator    schedule 28.10.2008
comment
นิพจน์ @[^.]*[.]\s*{4} ทำให้เกิดข้อผิดพลาดเกี่ยวกับปริมาณที่ซ้อนกัน นิพจน์ @([^.]*[.]){4}\s*; (จาก James Curran) ให้ผลลัพธ์เป็น: หนึ่ง สอง. สาม. สี่ หนึ่ง. สอง. สาม. สี่ เก้า. สิบ. สิบเอ็ด - person Tai Squared; 30.10.2008

คุณถูกบังคับให้ทำสิ่งนี้ผ่าน regex หรือไม่? จะดีกว่าไหมถ้าแยกสตริงแล้วประมวลผลอาร์เรย์

person EBGreen    schedule 28.10.2008

ฉันไม่แน่ใจว่าคำตอบของผู้กำหนดค่าถูกแก้ไขโดยบรรณาธิการหรืออะไร แต่มันใช้งานไม่ได้ รูปแบบที่ถูกต้องคือ

string regex = @"([^.]*[.]){4}\s*";
person James Curran    schedule 29.10.2008

นิพจน์การค้นหา: @"(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)(?:([^\.]+?).\s)" แทนที่นิพจน์: "$1 $2 $3 $4.\n"

ฉันได้รันนิพจน์นี้ใน RegexBuddy โดยเลือก .NET regex และผลลัพธ์คือ:

one two three four.
five six seven eight.
nine. ten. eleven

ฉันลองใช้การจัดเรียงประเภท @"(?:([^.]+?).\s){4}" แต่การจับภาพจะบันทึกเฉพาะเหตุการณ์สุดท้ายเท่านั้น (เช่น คำ) ดังนั้นเมื่อถึงเวลาเปลี่ยน คุณจะสูญเสียคำสามคำจาก 4 คำ โปรดมีคนช่วยแก้ไขฉันหากฉันผิด

person Ben    schedule 28.10.2008
comment
สตริงเดิมส่งผลให้ (วงเล็บเพื่อแสดงหนึ่งบรรทัด [หนึ่ง สอง สาม.] [สี่ ห้า หก เจ็ด.] [แปด. เก้า สิบ สิบเอ็ด] เรียกใช้สิ่งนี้บนสตริง เช่น: หนึ่ง สอง . สาม . สี่ ห้า . หก เจ็ด แปด . เก้า สิบ สิบเอ็ด ส่งผลให้ [ หนึ่ง สอง สาม.][. สี่ห้าหก] - person Tai Squared; 30.10.2008

ในกรณีนี้ ดูเหมือนว่า regex จะใช้งานมากเกินไปเล็กน้อย ฉันอยากจะแนะนำให้ใช้ String.split แล้วแยกอาร์เรย์สตริงผลลัพธ์ออก มันควรจะง่ายกว่าและเชื่อถือได้มากกว่าการพยายามทำให้ regex ทำสิ่งที่คุณพยายามทำ

บางสิ่งเช่นนี้อาจอ่านและแก้ไขข้อบกพร่องได้ง่ายกว่าเล็กน้อย

String s = "one. two. three. four. five. six. seven. eight. nine. ten. eleven"
String[] splitString = s.split(".")
List li = new ArrayList(splitString.length/2)
for(int i=0;i<splitString.length;i+=4) {
    st = splitString[i]+"."
    st += splitString[i+1]+"."
    st += splitString[i+2]+"."
    st += splitString[i+3]+"."
    li.add(st)
}
person Matthew Brubaker    schedule 28.10.2008