ฉันมีสตริงที่มีอักขระพิเศษมากมาย ฉันต้องการลบสิ่งเหล่านั้นทั้งหมด แต่ให้ใช้อักขระตามตัวอักษร
ฉันจะทำเช่นนี้ได้อย่างไร?
ฉันมีสตริงที่มีอักขระพิเศษมากมาย ฉันต้องการลบสิ่งเหล่านั้นทั้งหมด แต่ให้ใช้อักขระตามตัวอักษร
ฉันจะทำเช่นนี้ได้อย่างไร?
คำตอบ:
ขึ้นอยู่กับว่าคุณหมายถึงอะไร หากคุณต้องการกำจัดมันให้ทำสิ่งนี้:
(อัปเดต: เห็นได้ชัดว่าคุณต้องการเก็บตัวเลขด้วยเช่นกันใช้บรรทัดที่สองในกรณีนั้น)
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 ให้ดูคำถามเหล่านี้:
ฉันกำลังใช้สิ่งนี้
s = s.replaceAll("\\W", "");
แทนที่อักขระพิเศษทั้งหมดจากสตริง
ที่นี่
\ w: อักขระคำย่อมาจาก [a-zA-Z_0-9]
\ W: อักขระที่ไม่ใช่คำ
คุณสามารถใช้วิธีการต่อไปนี้เพื่อเก็บอักขระที่เป็นตัวอักษรและตัวเลข
replaceAll("[^a-zA-Z0-9]", "");
และหากคุณต้องการเก็บเฉพาะตัวอักษรให้ใช้สิ่งนี้
replaceAll("[^a-zA-Z]", "");
replaceAll("[^a-zA-Z0-9 ]", "");
แทนที่อักขระพิเศษโดย
replaceAll("\\your special character","new character");
เช่นแทนที่การเกิด * ทั้งหมดด้วยช่องว่าง
replaceAll("\\*","");
* คำสั่งนี้สามารถแทนที่อักขระพิเศษได้ครั้งละหนึ่งประเภทเท่านั้น
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9&, _]|^\s)", "");
ในที่นี้จะมีการแทนที่อักขระพิเศษทั้งหมดยกเว้นเว้นวรรคลูกน้ำและเครื่องหมายแอมเพอร์แซนด์ คุณยังสามารถเว้นวรรคลูกน้ำและเครื่องหมายแอมเพอร์แซนด์โดยใช้นิพจน์ทั่วไปต่อไปนี้
string Output = Regex.Replace(Input, @"([ a-zA-Z0-9_]|^\s)", "");
โดยที่อินพุตคือสตริงที่เราต้องการเพื่อแทนที่อักขระ
ตามตัวอย่างคำตอบของ 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;
}
}
คุณสามารถใช้นิพจน์ทั่วไปพื้นฐานบนสตริงเพื่อค้นหาอักขระพิเศษทั้งหมดหรือใช้รูปแบบและคลาสการจับคู่เพื่อค้นหา / แก้ไข / ลบสตริงที่ผู้ใช้กำหนด ลิงก์นี้มีตัวอย่างที่เรียบง่ายและเข้าใจง่ายสำหรับนิพจน์ทั่วไป: http://www.vogella.de/articles/JavaRegularExpressions/article.html
คุณสามารถรับ Unicode สำหรับอักขระขยะนั้นได้จากเครื่องมือของตัวละครในหน้าต่างพีซีและเพิ่ม \ u เช่น \ u00a9 สำหรับสัญลักษณ์ลิขสิทธิ์ ตอนนี้คุณสามารถใช้สตริงนั้นกับตัวอักษรขยะนั้น ๆ ได้แล้วอย่าลบอักขระขยะใด ๆ ออก แต่แทนที่ด้วยยูนิโคดที่เหมาะสม
สำหรับช่องว่างให้ใช้ "[^ az AZ 0-9]" รูปแบบนี้
let name = name.replace(/[&\/\\#,+()$~%!.„'":*‚^_¤?<>|@ª{«»§}©®™ ]/g, '').toLowerCase();