จะลบอักขระพิเศษออกจากสตริงได้อย่างไร?


92

ฉันต้องการลบอักขระพิเศษเช่น:

- + ^ . : ,

จากสตริงโดยใช้ Java


เห็นได้ชัดว่าคุณรู้แล้วว่านิพจน์ทั่วไปเป็นอย่างไรโดยพิจารณาจากวิธีที่คุณติดแท็กคำถามของคุณ คุณลองอ่านเอกสารประกอบของStringชั้นเรียนหรือไม่ โดยเฉพาะอย่างยิ่งให้มองหาคำว่า 'regex'; มีวิธีการสองสามวิธีและความคิดเล็กน้อยควรบอกวิธีดำเนินการ ... :)
Karl Knechtel

3
วลี "อักขระพิเศษ" ถูกใช้มากเกินไปจนแทบไม่มีความหมายเลย หากสิ่งที่คุณหมายถึงคือ "ฉันมีรายการอักขระเฉพาะที่ต้องการลบ" ให้ทำตามที่ Thomas แนะนำและสร้างรูปแบบของคุณด้วยคลาสอักขระ regex และจากreplaceAllนั้นก็ออกไป หากคุณมีข้อกำหนดที่ลึกลับมากขึ้นโปรดแก้ไขคำถาม :)
Ray Toal

1
เหล่านี้ไม่ใช่อักขระพิเศษ ... เหล่านี้คือ: äâìíìéèเนื่องจากไม่ใช่ประเภทอักขระ 1 ไบต์ทั่วไปของคุณเช่น - + ^ คือ ... อย่างไรก็ตามตามที่ Ray ระบุไว้ไม่ว่าจะทำreplaceAllเพื่อพวกเขาหรือทำการแยกวิเคราะห์ สตริงเพิ่มตัวอักษรที่ไม่ใช่อักขระที่คุณต้องการนำออกไปยังสตริงอื่นและในที่สุดก็ทำ + = กับสตริงที่คุณจะกลับมา
Gonçalo Vieira

deleteChars.apply( fromString, "-+^.:," );- ค้นหา deleteChars ที่นี่
Kaplan

คำตอบ:


258

ขึ้นอยู่กับสิ่งที่คุณกำหนดเป็นอักขระพิเศษ แต่ลองreplaceAll(...):

String result = yourString.replaceAll("[-+.^:,]","");

โปรดทราบว่าไฟล์ ^อักขระจะต้องไม่เป็นอักขระตัวแรกในรายการเนื่องจากคุณจะต้องหลีกหนีหรืออาจหมายถึง "อักขระใดก็ได้ยกเว้นอักขระเหล่านี้"

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

ดังนั้นเพื่อให้สอดคล้องและไม่ได้ขึ้นอยู่กับการวางตำแหน่งตัวอักษรที่คุณอาจต้องการที่จะหลบหนีทุกตัวอักษรที่มีความหมายพิเศษในการแสดงออกปกติ (รายการต่อไปนี้จะไม่สมบูรณ์ดังนั้นจึงควรตระหนักถึงตัวละครอื่น ๆ ชอบ(, {, $ ฯลฯ ) :

String result = yourString.replaceAll("[\\-\\+\\.\\^:,]","");


หากคุณต้องการที่จะได้รับการกำจัดของเครื่องหมายวรรคตอนและสัญลักษณ์ทั้งหมดลอง regex นี้: \p{P}\p{S}(เก็บไว้ในใจว่าในสตริง Java คุณจะต้องหลบหนีกลับมาทับ: "\\p{P}\\p{S}")

วิธีที่สามอาจเป็นแบบนี้หากคุณสามารถกำหนดสิ่งที่ควรทิ้งไว้ในสตริงของคุณ:

String  result = yourString.replaceAll("[^\\w\\s]","");

ซึ่งหมายความว่า: แทนที่ทุกอย่างที่ไม่ใช่อักขระคำ (az ไม่ว่าในกรณีใด ๆ , 0-9 หรือ _) หรือช่องว่าง

แก้ไข: โปรดทราบว่ามีรูปแบบอื่น ๆ ที่อาจเป็นประโยชน์ แต่ผมไม่สามารถอธิบายให้พวกเขาทั้งหมดเพื่อให้ดูได้ที่ส่วนการอ้างอิงของregular-expressions.info

ทางเลือกที่ จำกัด น้อยกว่าสำหรับแนวทาง "กำหนดอักขระที่อนุญาต" ตามที่ Ray แนะนำ:

String  result = yourString.replaceAll("[^\\p{L}\\p{Z}]","");

นิพจน์ทั่วไปจะจับคู่ทุกอย่างที่ไม่ใช่ตัวอักษรในภาษาใด ๆ และไม่ใช่ตัวคั่น (เว้นวรรค, linebreak ฯลฯ ) โปรดทราบว่าคุณไม่สามารถใช้ไฟล์[\P{L}\P{Z}] (ตัวพิมพ์ใหญ่ P หมายถึงไม่มีคุณสมบัตินั้น) เนื่องจากจะหมายถึง "ทุกสิ่งที่ไม่ใช่ตัวอักษรหรือไม่ใช่ช่องว่าง" ซึ่งเกือบจะตรงกับทุกอย่างเนื่องจากตัวอักษรไม่ใช่ช่องว่างและในทางกลับกัน

ข้อมูลเพิ่มเติมเกี่ยวกับ Unicode

อักขระ Unicode บางตัวดูเหมือนจะก่อให้เกิดปัญหาเนื่องจากวิธีต่างๆที่เป็นไปได้ในการเข้ารหัส (เป็นจุดรหัสเดียวหรือจุดรหัสรวมกัน) โปรดดูที่regular-expressions.infoสำหรับข้อมูลเพิ่มเติม


+1 สำหรับโซลูชันเอนกประสงค์ที่ดีที่สุด เนื่องจากคุณแสดงรายการรูปแบบสองสามรูปแบบในกรณีที่ไม่มีรายละเอียดจาก OP คุณอาจแสดงและอธิบายรูปแบบเช่น[\P{L}]
Ray Toal

โปรดทราบว่า-อักขระต้องเป็นอักขระตัวแรกหรือตัวสุดท้ายในรายการมิฉะนั้นจะต้องมีการใช้ Escape
kapex

[^\\p{L}\\p{Z}]ดูเหมือนจะกำจัด Umlauts ภาษาเยอรมัน (ä, ö, ü) ด้วย (อย่างน้อยก็ทำเพื่อฉัน: /) ดังนั้น "นิพจน์ทั่วไปจะจับคู่ทุกอย่างที่ไม่ใช่ตัวอักษรในภาษาใด ๆ " ดูเหมือนจะไม่ถูกต้อง 100%
ปีเตอร์

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

1
@Thomas String result = yourString.replaceAll("[^\w\s]","");ทำให้ผิดพลาดInvalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
Visruth

41

สิ่งนี้จะแทนที่อักขระทั้งหมดยกเว้นตัวอักษรและตัวเลข

replaceAll("[^A-Za-z0-9]","");

การดำเนินการนี้จะลบอักขระอารบิกด้วย
S0haib Nasir

1
นี่คือคำตอบที่ดีที่สุด
Marius Razvan Varvarei

18

ตามที่อธิบายไว้ที่นี่ http://developer.android.com/reference/java/util/regex/Pattern.html

รูปแบบถูกรวบรวมนิพจน์ทั่วไป ในหลายกรณีวิธีการอำนวยความสะดวกเช่นString.matches, String.replaceAllและString.splitจะดีกว่า แต่ถ้าคุณต้องการที่จะทำมากของการทำงานที่มีการแสดงออกปกติเดียวกันก็อาจจะมีประสิทธิภาพมากขึ้นในการรวบรวมครั้งเดียวและนำมาใช้ใหม่ คลาส Pattern และ Matcher ที่เป็นคู่หูยังมีฟังก์ชันการทำงานที่มากกว่าจำนวนเล็กน้อยที่แสดงโดย String

public class RegularExpressionTest {

public static void main(String[] args) {
    System.out.println("String is = "+getOnlyStrings("!&(*^*(^(+one(&(^()(*)(*&^%$#@!#$%^&*()("));
    System.out.println("Number is = "+getOnlyDigits("&(*^*(^(+91-&*9hi-639-0097(&(^("));
}

 public static String getOnlyDigits(String s) {
    Pattern pattern = Pattern.compile("[^0-9]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
 public static String getOnlyStrings(String s) {
    Pattern pattern = Pattern.compile("[^a-z A-Z]");
    Matcher matcher = pattern.matcher(s);
    String number = matcher.replaceAll("");
    return number;
 }
}

ผลลัพธ์

String is = one
Number is = 9196390097

การดำเนินการนี้จะลบอักขระภาษาอาหรับ
S0haib Nasir

15

ลองใช้replaceAll()วิธีการของStringคลาส

BTW นี่คือวิธีการประเภทผลตอบแทนและพารามิเตอร์

public String replaceAll(String regex,
                         String replacement)

ตัวอย่าง:

String str = "Hello +-^ my + - friends ^ ^^-- ^^^ +!";
str = str.replaceAll("[-+^]*", "");

ควรลบตัวอักษร {'^', '+', '-'} ทั้งหมดที่คุณต้องการลบออก!


6

เพื่อลบอักขระพิเศษ

String t2 = "!@#$%^&*()-';,./?><+abdd";

t2 = t2.replaceAll("\\W+","");

ผลลัพธ์จะเป็น: abdd.

นี้ทำงานได้อย่างสมบูรณ์


1
จะได้รับอักขระหลีกที่ผิดกฎหมายในตัวอักษรสตริง
John Joe

นอกจากนี้ยังจะลบช่องว่างหากคุณต้องการเว้นช่องว่างจากนั้นใช้ t2 = t2.replaceAll ("[^ \\ w \\ s]", "");
Isuru Dilshan


1

คุณสามารถลบถ่านเดี่ยวได้ดังนี้:

String str="+919595354336";

 String result = str.replaceAll("\\\\+","");

 System.out.println(result);

เอาท์พุท:

919595354336

0

หากคุณแค่ต้องการทำการแทนที่ตัวอักษรใน java ให้ใช้Pattern.quote(string)เพื่อหลีกเลี่ยงสตริงใด ๆ ไปเป็นลิเทอรัล

myString.replaceAll(Pattern.quote(matchingStr), replacementStr)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.