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


197

ฉันพยายามใช้สิ่งนี้ แต่ไม่ได้ผล

return value.replaceAll("/[^A-Za-z0-9 ]/", "");

36
พวกคุณลืมว่ามีตัวอักษรอื่นนอกเหนือจากภาษาละติน
Mateva

2
แต่ถ้าคุณต้องการตรวจสอบชื่อโฮสต์เช่นนี้จะเป็นการดีที่จะยกเว้นตัวอักษรที่ไม่ถูกต้อง
Gurnard

คำตอบ:


245

[^A-Za-z0-9]ใช้

หมายเหตุ: นำช่องว่างออกเนื่องจากไม่นับเป็นตัวอักษรและตัวเลข


10
ไม่ควรเว้นวรรคในตอนท้ายของคลาสอักขระ
Andrew Duffy

6
เขาอาจเคยชินกับการเขียนโปรแกรมใน PHP
วิลเลียม

10
@William - เป็นเรื่องโชคร้ายที่ PHP ได้รับเครดิตสำหรับ PCRE
Thomas Dignan

exp ประสบการณ์เป็น ok เพียงแค่ลบ "/" จากสตริง regexp จาก value.replaceAll ("/ [^ A-Za-z0-9] /", ""); ถึง value.replaceAll ("[^ A-Za-z0-9]", ""); คุณไม่ต้องการ "/" ใน regexp ฉันคิดว่าคุณสับสนกับรูปแบบจาวาสคริปต์
eriknyk

128

ลอง

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

หรือ

return value.replaceAll("[\\W]|_", "");

4
ด้วยขีดreturn value.replaceAll("\\W", "");
เอริก

แน่นอน. คอมไพเลอร์ยอดเยี่ยมในการจำสิ่งนั้น
Andrew Duffy

1
คนที่สองไม่ตอบคำถาม ตัวละครที่ชอบ: / \ etc?
WW

67

คุณควรทราบว่า[^a-zA-Z]จะแทนที่ตัวละครที่ไม่ได้อยู่ในช่วงตัวอักษร AZ / az นั่นหมายความว่าตัวอักษรพิเศษชอบé, ßฯลฯ หรือตัวอักษรซีริลลิและดังกล่าวจะถูกลบออก

หากไม่ต้องการแทนที่อักขระเหล่านี้ให้ใช้คลาสอักขระที่กำหนดไว้ล่วงหน้าแทน:

 str.replaceAll("[^\\p{IsAlphabetic}\\p{IsDigit}]", "");

PS: ไม่บรรลุผลนี้จะทำหน้าที่เช่นเดียวกับ\p{Alnum}[A-Za-z0-9]


11
ขอบคุณมากสำหรับโพสต์นี้ - มันมีประโยชน์มากสำหรับฉัน นอกจากนี้ฉันเชื่อว่านี่เป็นคำตอบที่แท้จริงสำหรับคำถาม ตัวอักษรละตินไม่ใช่ตัวอักษรเดียวในโลก!
Mateva

2
ที่จริงแล้ว regex ที่ระบุไว้จะถือว่า "^" เป็นอักขระที่ถูกต้องเนื่องจากการเกิดขึ้นครั้งแรกของ "^" เท่านั้นคือการปฏิเสธความหมายของการเลือก [^\\p{IsAlphabetic}\\p{IsDigit}]ทำได้ดี.
Bogdan Klichuk

1
@JakubTurcovsky docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.htmlกำหนด IsAlphabetic และ IsDigit เป็นคุณสมบัติไบนารี Alpha และ Digit เป็นคลาสอักขระ POSIX (US-ASCII เท่านั้น) ยกเว้นการระบุค่าสถานะdocs.oracle.com/javase/10/docs/api/java/util/regex/…
Andre Steingress

@AndreSteingress ถูกต้องเหตุผล{IsDigit}ไม่ทำงานสำหรับฉันและ{Digit}ไม่เป็นเพราะฉันลองบน Android และ Android ได้UNICODE_CHARACTER_CLASSเปิดใช้งานตามค่าเริ่มต้น ขอบคุณสำหรับการกวาดล้าง
Jakub Turcovsky

จะอนุญาตเฉพาะ Alpha, Digit และ Emoji ได้อย่างไร
Robert Goodrick

50
return value.replaceAll("[^A-Za-z0-9 ]", "");

สิ่งนี้จะทำให้ช่องว่างไม่เสียหาย ฉันคิดว่านั่นคือสิ่งที่คุณต้องการ มิฉะนั้นให้ลบช่องว่างออกจาก regex


21

คุณสามารถลองใช้ regex ที่เรียบง่ายกว่านี้ได้:

 str = str.replaceAll("\\P{Alnum}", "");

2
หรือรักษาช่องว่าง:str.replaceAll("[^\\p{Alnum}\\s]", "")
Jonik

\\p{Alnum}\\p{Space}หรือ
membersound

10

นิพจน์ทั่วไปของ Java ไม่ต้องการให้คุณใส่เครื่องหมายทับหน้า ( /) หรือตัวคั่นอื่น ๆ รอบ ๆ regex ซึ่งตรงข้ามกับภาษาอื่น ๆ เช่น Perl เช่น


8

ฉันทำวิธีนี้ในการสร้างชื่อไฟล์:

public static String safeChar(String input)
{
    char[] allowed = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_".toCharArray();
    char[] charArray = input.toString().toCharArray();
    StringBuilder result = new StringBuilder();
    for (char c : charArray)
    {
        for (char a : allowed)
        {
            if(c==a) result.append(a);
        }
    }
    return result.toString();
}

5
นี่เป็นสัตว์ที่ดุร้าย Regex เป็นวิธีที่จะไปกับสถานการณ์ของ OP
Michael Peterson

1
คุณพูดถูก regex ดีกว่า แต่ในเวลานั้น regex กับฉันฉันไม่ได้เข้ากันได้ดี
zneo

ฮ่า ๆ ไม่มีใครเข้ากันได้ดีกับ regex หรือไม่ ;)
Michael Peterson

6

สารละลาย:

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

คำอธิบาย:

[^abc] เมื่อเครื่องหมายรูปหมวก^ปรากฏเป็นอักขระตัวแรกในวงเล็บเหลี่ยม รูปแบบนี้ตรงกับอักขระใด ๆ ยกเว้น a หรือ b หรือ c

ดูคำหลักเป็นสองฟังก์ชัน:

  • [(Pattern)] = match(Pattern)
  • [^(Pattern)] = notMatch(Pattern)

นอกจากนี้เกี่ยวกับรูปแบบ:

  • A-Z = all characters included from A to Z

  • a-z = all characters included from a to z

  • 0=9 = all characters included from 0 to 9

ดังนั้นมันจะแทนที่ถ่านทั้งหมดที่ไม่รวมอยู่ในรูปแบบ


3

หากคุณต้องการอนุญาตให้ใช้ตัวอักษรและตัวเลขที่ไม่ได้อยู่ในชุดอักขระ ASCII เช่นในภาษาเยอรมัน umlaut คุณสามารถลองใช้วิธีแก้ปัญหาต่อไปนี้:

 String value = "your value";

 // this could be placed as a static final constant, so the compiling is only done once
 Pattern pattern = Pattern.compile("[^\\w]", Pattern.UNICODE_CHARACTER_CLASS);

 value = pattern.matcher(value).replaceAll("");

โปรดทราบว่าการใช้งานธง UNICODE_CHARACTER_CLASS อาจมีการกำหนดโทษปรับประสิทธิภาพ (ดู javadoc ของธงนี้)


1

วิธีง่าย ๆ :

public boolean isBlank(String value) {
    return (value == null || value.equals("") || value.equals("null") || value.trim().equals(""));
}

public String normalizeOnlyLettersNumbers(String str) {
    if (!isBlank(str)) {
        return str.replaceAll("[^\\p{L}\\p{Nd}]+", "");
    } else {
        return "";
    }
}


1

เมื่อใช้ Guava คุณสามารถรวมเกณฑ์ประเภทต่างๆได้อย่างง่ายดาย สำหรับโซลูชันเฉพาะของคุณคุณสามารถใช้:

value = CharMatcher.inRange('0', '9')
        .or(CharMatcher.inRange('a', 'z')
        .or(CharMatcher.inRange('A', 'Z'))).retainFrom(value)

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