簡體   English   中英

如何在 Java 中使用正則表達式從字符串中刪除所有非字母字符

[英]How can I remove all Non-Alphabetic characters from a String using Regex in Java

我想從字符串中刪除所有非字母字符。

輸入

"-Hello, 1 world$!"

Output:

"Helloworld"

但我得到的是: "Hello1world"

我該如何解決?

我的代碼:

public class LabProgram {
    public static String removeNonAlpha (String userString) {
    String[] stringArray = userString.split("\\W+");
        String result = new String();
        
        for(int i = 0; i < stringArray.length;i++){
            result = result+ stringArray[i];
        }
        
        return result;
    }
    
    public static void main(String args[]) {
        Scanner scnr = new Scanner(System.in);
        String str = scnr.nextLine();
        String result = removeNonAlpha(str);
        System.out.println(result);
    }
}

這應該有效:

import java.util.Scanner;

public class LabProgram {
    public static String removeNonAlpha (String userString) {
        // If you only want to remove the characters A to Z (lower an uppercase)
        //return userString.replaceAll("[^A-Za-z]+", "");
        return userString.replaceAll("[^\\p{Alpha}]+", "");
    }
    
    public static void main(String args[]) {
        Scanner scnr = new Scanner(System.in);
        String str = scnr.nextLine();
        String result = removeNonAlpha(str);
        System.out.println(result);
    }
}

看一下replaceAll() ,它需要一個正則表達式作為第一個參數,一個替換字符串作為第二個參數:

return userString.replaceAll("[^\\p{Alpha}]", "");

有關正則表達式的更多信息,請查看本教程

你可以使用:

 public static String removeNonAlpha (String userString) {
    return userString.replaceAll("[^a-zA-Z]+",  "");
}

問題是您的正則表達式模式不僅匹配字母,還匹配數字和下划線字符,因為這就是\W所做的。 替換它可以解決問題:

String[] stringArray = userString.split("\\P{Alpha}+");

根據Pattern Javadocs, \W匹配任何非單詞字符,其中單詞字符在\w中定義為[a-zA-Z_0-9] 這意味着它匹配大寫和小寫 ASCII 字母 A - Z & a - z、數字 0 - 9 和下划線字符 (“_”)。

解決方案是使用僅排除您想要排除的字符的正則表達式模式。 根據模式文檔可以執行[^a-zA-Z]\P{Alpha}來排除主要的 26 個大小寫字母。 如果你想計算 26 個 ASCII 字母以外的字母(例如非拉丁字母表中的字母),你可以使用\P{IsAlphabetic}

\p{ prop }如果輸入具有屬性prop則匹配,而\P{ prop }如果輸入具有該屬性則不匹配。

正如其他答案所指出的那樣,您的代碼還存在其他問題,使其不合慣用,但這些問題不會影響您解決方案的正確性。

\W相當於[a-zA-Z_0-9] ,因此它包含數字字符。

只需將其替換為"[^a-zA-Z]+" ,如下例所示:

import java.util.Arrays;

class Scratch {
    public static void main(String[] args) {
        String input = "-Hello, 1    world$!";
        System.out.println("Input : " + input);
        String[] split = input.split("[^a-zA-Z]+");
        StringBuilder builder = new StringBuilder();
        Arrays.stream(split).forEach(builder::append);
        System.out.println("Ouput :" + builder);
    }
}

Output:

Input : -Hello, 1    world$!
Ouput :Helloworld

您可以查看這篇文章以了解有關正則表達式的更多詳細信息: https://www.vogella.com/tutorials/JavaRegularExpressions/article.html#meta-characters

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM