2014-03-19 77 views
1
非字母字符的話

例如,如果我要刪除非字母字符,我會做:如何排除有從字符串

for (int i = 0; i < s.length; i++) { 
    s[i] = s[i].replaceAll("[^a-zA-Z]", ""); 
} 

如何完全排除與非詞字符串中的字母字符?

例如: 初始輸入:

"a cat jumped jumped; on the table" 

應該排除 「躍升;」因爲 」;」。

輸出:

"a cat jumped on the table" 
+2

你是什麼意思'排除一個字......從我array'?數組不能改變其長度。你想用空字符串替換這樣的詞嗎? – Pshemo

+1

您是否有一組單詞,並且想要刪除非字母字符的單詞?請給出示例輸入,期望輸出和實際輸出。 – MirroredFate

+1

你想創建一個新的,更短的數組,缺乏你想排除的單詞嗎?這對於列表而不是數組會更容易一些。 –

回答

2

編輯:(響應您的編輯)

你可以這樣做:

String input = "a cat jumped jumped; on the table"; 
input = input.replaceAll("(^|)[^ ]*[^A-Za-z ][^ ]*(?=$|)", ""); 

讓我們打破正則表達式:後

  • (^|)比賽的一個單詞的開始,無論是在空格之後還是在字符串開始之後。
  • [^ ]*任何序列,包括空字符串,非空間的匹配(因爲空間打破字)
  • [^A-Za-z ]檢查該字符非字母和不破的字符串。
  • 最後,我們需要追加[^ ]*以使它匹配到單詞的結尾。
  • (?=$|)字的結束時,無論是字符串或下一個空格字符的結束相匹配,但它不消耗下一個空間,使連續的字將仍然匹配(即"I want to say hello, world! everybody"變得"I want to say everybody"

注:如果"a cat jumped off the table."應該輸出"a cat jumped off the table",然後使用此:

input = input.replaceAll(" [^ ]*[^A-Za-z ][^ ]*(?=)", "").replaceAll("[^A-Za-z]$", ""); 

假設你有每個數組元素1個字,你可以做到這一點,以取代它們空字符串:

for (String string: s) { 
    if (s.matches(".*[^A-Za-z].*") { 
     s = ""; 
    } 
} 

如果你真的想刪除它,請考慮使用ArrayList

ArrayList<String> stringList = new ArrayList<>(); 

for (int index = 0; index < s.length; index++) { 
    if (s[index].matches(".*[^A-Za-z].*") { 
     stringList.add(s[index]); 
    } 
} 

而且ArrayList將所有沒有在他們非字母字符元素。

+1

它不會匹配「123abass; [; []」:) – TheLostMind

+0

@Quincunx感謝您爲數組和字符串解釋它! – user3383621

+0

@Quincunx我測試了所有的方法,以確保我明白,但由於某種原因,「。」不會被刪除。爲什麼? – user3383621

0

試試這個:

s = s[i].join(" ").replaceAll("\\b\\w*\\W+\\w*(?=\\b)", "").split(" "); 

它加入與空間陣列,然後應用正則表達式。正則表達式查找一個分詞符(\b),然後至少包含一個非單詞字符(\w*\W+\w*),然後在末尾有一個單詞中斷(不匹配,仍然有空格)。 split將字符串分割成數組。

0
public static void main(String[] args) throws ClassNotFoundException { 
    String str[] ={ "123abass;[;[]","abcde","1234"}; 
    for(String s : str) 
    { 
     if(s.matches("^[a-zA-Z]+$")) // should start and end with [a-zA-Z] 
     System.out.println(s); 
    } 

O/P : abcde 
+0

中,如果在數組中有一個像「123abass; [; [] _」的單詞,它應該完全排除,而不是從「壞」字符中刪除。 – user3383621

+0

@ user3383621 - 檢查我編輯的答案。 – TheLostMind

+1

不需要使用'^'和'$',因爲Java會自動運行,就好像它們在那裏一樣。 – Justin

0

你可以在陣列中的每個值使用.toLowerCase(),則搜索所述陣列針對-z值,這將是比一個正則表達式快。假定您的值位於名爲「myArray」的數組中。

List<String> newValues = new ArrayList<>(); 
for(String s : myArray) { 
    if(containsOnlyLetters(s)) { 
    newValues.add(s); 
    } 
} 
//do this if you have to go back to an array instead of an ArrayList 
String[] newArray = (String[])newValues.toArray(); 

這是containsOnlyLetters方法:

boolean containsOnlyLetters(String input) { 
    char[] inputLetters = input.toLowerCase().toCharArray(); 
    for(char c : inputLetters) { 
    if(c < 'a' || c > 'z') { 
     return false; 
    } 
    } 
    return true; 
} 
相關問題