String.replaceAll ไม่มี RegEx


116

ฉันต้องการแทนที่อินสแตนซ์ทั้งหมดของสตริงย่อยในสตริง แต่String.replaceAll()ยอมรับเฉพาะรูปแบบเท่านั้น สตริงที่ฉันได้มาจากการแข่งขันครั้งก่อน เป็นไปได้ไหมที่จะเพิ่ม Escape ให้กับรูปแบบที่ฉันมีหรือมีเวอร์ชันของreplaceAll()คลาสอื่นที่ยอมรับสตริงตัวอักษรแทนรูปแบบ


คำตอบ:


189

เพียงแค่ใช้มากกว่าString.replace(CharSequence,CharSequence)replaceAll


13
นี่ไม่ใช่แค่แทนที่ครั้งแรก? แปลกที่พวกเขาเรียกมันว่า "replaceAll" แทนที่จะเป็น "replaceRegex"
Magic Octopus Urn

6
System.out.println("hello world, hello life, hello you".replace("hello","hi"));"hi world, hi life, hi you"ผลตอบแทน
Thiago Mata

14
@MagicOctopusUrn: ใช่ฉันยอมรับว่ามันเป็นการตั้งชื่อที่แย่มาก - มันทำให้เกิดความสับสนเมื่อเวลาผ่านไป
Jon Skeet

การตั้งชื่อวิธีการที่ไม่ดีมาก ทำไมพวกเขา (ดวงอาทิตย์ / oracle) ทำให้เรื่องง่าย ๆ ซับซ้อน
Stunner

94

Pattern.quote()วิธีการที่จะเพิ่มการหลบหนีเป็น

String replaced = myString.replaceAll(Pattern.quote(matchingStr), replacementStr)

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


ทำงานได้อย่างสมบูรณ์ถ้าคุณมี "$" ใน matchingStr ของคุณเช่น
Julien Lafont

ค่อนข้าง Pattern.compile (); Pattern.quote () นำมาซึ่งผลลัพธ์ที่ไม่พึงปรารถนา
Pavlo Zvarych

@PavloZvarych: Pattern.compile()รวบรวมสตริงเป็นนิพจน์ทั่วไปซึ่งหมายความว่าอักขระพิเศษจะได้รับความหมายพิเศษ นั่นเป็นสิ่งที่ตรงกันข้ามอย่างสิ้นเชิงกับสิ่งที่Pattern.quote()ทำและสิ่งที่ OP ขอ ( quote()พูดว่า "ถือว่าสตริงเป็นตัวอักษร") บางทีคุณอาจขยายความว่า "ผลลัพธ์ที่ไม่พึงปรารถนา" ที่คุณกำลังพูดถึงคืออะไร
Mark Peters

@MarkPeters มันเหมือนกับ \\ G1 \\ G สำหรับ "$ 1"
Pavlo Zvarych

1
@PavloZvarych: ถ้าคุณกำลังพยายามที่จะพูดแทน (และไม่ได้เป็นรูปแบบการค้นหา), Matcher.quoteReplacement("$aa +")คุณต้องการที่จะใช้ Pattern.compile()สร้าง a Patternไม่ใช่ a Stringดังนั้นฉันจึงไม่ชัดเจนว่าคุณใช้มันreplaceAllอย่างไร
Mark Peters
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.