จะแทนที่อักขระพิเศษในสตริงได้อย่างไร?


92

ฉันมีสตริงที่มีอักขระพิเศษมากมาย ฉันต้องการลบสิ่งเหล่านั้นทั้งหมด แต่ให้ใช้อักขระตามตัวอักษร

ฉันจะทำเช่นนี้ได้อย่างไร?


ดูกระทู้นี้: stackoverflow.com/questions/3438854/…
Cyril Gandon

คำตอบ:


190

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

String alphaOnly = input.replaceAll("[^a-zA-Z]+","");
String alphaAndDigits = input.replaceAll("[^a-zA-Z0-9]+","");

หรือเทียบเท่า:

String alphaOnly = input.replaceAll("[^\\p{Alpha}]+","");
String alphaAndDigits = input.replaceAll("[^\\p{Alpha}\\p{Digit}]+","");

(สิ่งเหล่านี้สามารถปรับปรุงได้อย่างมีนัยสำคัญโดยการคอมไพล์รูปแบบ regex ไว้ล่วงหน้าและเก็บไว้ในค่าคงที่)

หรือกับฝรั่ง :

private static final CharMatcher ALNUM =
  CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z'))
  .or(CharMatcher.inRange('0', '9')).precomputed();
// ...
String alphaAndDigits = ALNUM.retainFrom(input);

แต่ถ้าคุณต้องการเปลี่ยนอักขระที่เน้นเสียงให้เป็นสิ่งที่สมเหตุสมผลซึ่งยังคงเป็น ascii ให้ดูคำถามเหล่านี้:


เมื่อฉันใช้ฟังก์ชันนี้มันเป็นการลบตัวเลขทั้งหมดเช่นกัน แต่ฉันไม่ต้องการลบตัวเลขเพียงแค่ต้องการลบอักขระพิเศษช่วยแนะนำบางอย่าง ..
Tanu

คุณบอกว่าคุณต้องการตัวอักษรเท่านั้น แต่ฉันจะอัปเดตคำตอบในอีกสักครู่
Sean Patrick Floyd

ฉันต้องการต่อสตริง แต่มีเงื่อนไขบางอย่างเช่น 1. หากมีเพียงผลลัพธ์เดียวที่ไม่จำเป็นต้องเชื่อมต่อ 2. ถ้าผลลัพธ์มากกว่า 1 มากกว่าสตริง concat ในตัวอย่างรูปแบบต่อไปนี้: stack + over + flow
Tanu

2
@ Tanu นั่นเป็นคำถามที่แตกต่างออกไป ทำให้ใหม่
Pekka

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

74

ฉันกำลังใช้สิ่งนี้

s = s.replaceAll("\\W", ""); 

แทนที่อักขระพิเศษทั้งหมดจากสตริง

ที่นี่

\ w: อักขระคำย่อมาจาก [a-zA-Z_0-9]

\ W: อักขระที่ไม่ใช่คำ


ไม่ทำงานสำหรับ <script> alert ('XSS Attack') </script> วิธีลบอักขระ '<', '>', '\'
มาโนช

11

คุณสามารถใช้วิธีการต่อไปนี้เพื่อเก็บอักขระที่เป็นตัวอักษรและตัวเลข

replaceAll("[^a-zA-Z0-9]", "");

และหากคุณต้องการเก็บเฉพาะตัวอักษรให้ใช้สิ่งนี้

replaceAll("[^a-zA-Z]", "");

6
สำหรับการใช้พื้นที่replaceAll("[^a-zA-Z0-9 ]", "");
Qamar

6

แทนที่อักขระพิเศษโดย

replaceAll("\\your special character","new character");

เช่นแทนที่การเกิด * ทั้งหมดด้วยช่องว่าง

replaceAll("\\*","");

* คำสั่งนี้สามารถแทนที่อักขระพิเศษได้ครั้งละหนึ่งประเภทเท่านั้น


สิ่งที่ฉันกำลังมองหาอย่างแน่นอนเมื่อเห็นหัวข้อคำถาม "จะแทนที่อักขระพิเศษในสตริงได้อย่างไร" ขอบคุณ!
Mr.Drew

2
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");

ในที่นี้จะมีการแทนที่อักขระพิเศษทั้งหมดยกเว้นเว้นวรรคลูกน้ำและเครื่องหมายแอมเพอร์แซนด์ คุณยังสามารถเว้นวรรคลูกน้ำและเครื่องหมายแอมเพอร์แซนด์โดยใช้นิพจน์ทั่วไปต่อไปนี้

string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");

โดยที่อินพุตคือสตริงที่เราต้องการเพื่อแทนที่อักขระ


2

ตามตัวอย่างคำตอบของ Andrzej Doyleฉันคิดว่าทางออกที่ดีกว่าคือใช้org.apache.commons.lang3.StringUtils.stripAccents():

package bla.bla.utility;

import org.apache.commons.lang3.StringUtils;

public class UriUtility {
    public static String normalizeUri(String s) {
        String r = StringUtils.stripAccents(s);
        r = r.replace(" ", "_");
        r = r.replaceAll("[^\\.A-Za-z0-9_]", "");
        return r;
    }
}

0

คุณสามารถใช้นิพจน์ทั่วไปพื้นฐานบนสตริงเพื่อค้นหาอักขระพิเศษทั้งหมดหรือใช้รูปแบบและคลาสการจับคู่เพื่อค้นหา / แก้ไข / ลบสตริงที่ผู้ใช้กำหนด ลิงก์นี้มีตัวอย่างที่เรียบง่ายและเข้าใจง่ายสำหรับนิพจน์ทั่วไป: http://www.vogella.de/articles/JavaRegularExpressions/article.html


0

คุณสามารถรับ Unicode สำหรับอักขระขยะนั้นได้จากเครื่องมือของตัวละครในหน้าต่างพีซีและเพิ่ม \ u เช่น \ u00a9 สำหรับสัญลักษณ์ลิขสิทธิ์ ตอนนี้คุณสามารถใช้สตริงนั้นกับตัวอักษรขยะนั้น ๆ ได้แล้วอย่าลบอักขระขยะใด ๆ ออก แต่แทนที่ด้วยยูนิโคดที่เหมาะสม



-1
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();

คุณช่วยอธิบาย regex หน่อยได้ไหม
stdunbar

ฉันแนะนำให้คุณเพิ่มบันทึกในส่วนคำตอบของคุณเพื่ออธิบายรหัสของคุณ โปรดอ่านเพิ่มเติมเกี่ยวกับวิธีการเขียนคำตอบที่ดี
Joe Ferndz

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