2014-07-22 94 views
1

我想從我的文本數據中只刪除標點符號,但保留重音字母。我不想用英文等值替換重音字母。我無法弄清楚如何調整我現有的代碼以允許更高的ascii字符。如何只刪除標點符號但留下重音字母?

while (input.hasNext()){ 
     String phrase = input.nextLine(); 
     String[] words = phrase.split(" "); 
     for(String word: words){ 
       String strippedInput = word.replaceAll("[^0-9a-zA-Z\\s]", ""); 
     } 
    } 

如果原來的輸入是: ØSAL,歐Ø鈉代,tambémécontraindicado EM pacientes hipotensos?

預期的輸出應該是: ØSAL歐Ø鈉代tambémécontraindicado EM pacientes hipotensos

任何想法?謝謝!

回答

2
Try this. 

public class punctuationRemove { 

//private static String punc = "[][(){},.;!?<>%]"; 
static StringBuilder sb = new StringBuilder(); 
static char[] punc = "',.;!?(){}[]<>%".toCharArray(); 

public static void main(String[] args){ 
     String s = "Hello!, how are you?"; 
     System.out.println(removePuntuation(s)); 
    } 

public static String removePuntuation(String s) 
{ 
    String tmp; 
    boolean fl=true; 

    for(int i=0;i<s.length();i++) 
    { 
     fl=true; 
     char strChar=s.charAt(i); 
     for (char badChar : punc) 
     { 
      if (badChar == strChar) 
      { 
       fl=false; 
       break; 
      } 
      } 

      if(fl) 
      { 
      sb.append(strChar); 
      } 
    } 
    return sb.toString(); 
} 
} 
+2

好主意,用一個字符數組所有必要的標點符號。糾正我,如果我錯了,但不應該for循環結束條件只是我 AdamMc331

+0

對不起@ McAdam331.Yeah它的真實!它必須是s.length()。想知道我是如何登陸s.length-1的。請更新更正。 –

+0

不需要抱歉。我試圖爲你編輯,但是Stack需要編輯6個字符。從0開始的索引有時很難遵循。我的意思是,你甚至可以將它改爲i <= s.Length() - 1,然後你將有一個有效的for循環。 – AdamMc331

0

這可能是低效的,我敢肯定,這個想法可以改進,但你可以創建一個通過字符串循環,建設一個沒有標點的每個字符的緩衝方法。

private String replacePunctuation(String s){ 
    String output = ""; 

    for(int i = 0; i < s.Length(); i++){ 
     if(s.charAt(i) != '.' && s.charAt(i) != ',' && s.charAt(i) != '!') // Add other punctuation values you're concerned about. Perhaps the Regex class would be useful here, but I am not as familiar with it as I would like. 
      output += s.charAt(i); 
     } 
    } 
} 

再次,可能不是最乾淨或最有效的,但這是我現在可以提出的最好的。

1

也許我錯過了點,但像...

String text = "O sal, ou o sódio, também é contraindicado em pacientes hipotensos?"; 
System.out.println(text); 
System.out.println(text.replaceAll("[\\?,.:!\\(\\){}\\[\\]<>%]", "")); 

輸出

O sal, ou o sódio, também é contraindicado em pacientes hipotensos? 
O sal ou o sódio também é contraindicado em pacientes hipotensos 

或者,根據你的榜樣......

while (input.hasNext()){ 
    String phrase = input.nextLine(); 
    String[] words = phrase.split(" "); 
    for(String word: words){ 
      String strippedInput = word.replaceAll("[\\?,.:!\\(\\){}\\[\\]<>%]", ""); 
    } 
} 
3

考慮使用Unicode Categories,因爲「AZ」非常以英語爲中心,甚至沒有處理髮現的口音。

例如,下面將取代一切,包括標點符號,除了 「任何字母,任何語言」(\p{L})或"whitespace"\s)。如果需要保留數字,請將其重新添加爲額外的排除項。

replaceAll("[^\\p{L}\\s]", "") 

這裏是an ideone demo

2

取代A-ZA-Z在正則表達式的字符串\ p {L}(任何種類的信任何語言)

while (input.hasNext()){ 
    String phrase = input.nextLine(); 
    String[] words = phrase.split(" "); 
    for(String word: words){ 
      String strippedInput = word.replaceAll("[^0-9\\p{L}\\s]", ""); 
    } 
} 
相關問題