如何删除标点但留下重音字母?

时间:2014-07-22 03:43:14

标签: java string

我试图仅删除文本数据中的标点符号,但保留重音字母。我不想用英语等同替换重音字母。我无法弄清楚如何调整我现有的代码以允许更高的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]", ""); 
        }
     }

如果原始输入是: O sal,ouosódio,tambéméconstindicadoem pacientes hipotensos?

预期产量应为: O sal ouosódicotambéméconstindicadoem pacientes hipotensos

有什么想法吗?谢谢!

5 个答案:

答案 0 :(得分:3)

考虑使用Unicode Categories," A-Z"是非常以英语为中心,甚至没有应对所发现的口音。

例如,以下内容将替换所有内容,包括标点符号,除了"任何字母,任何语言" (\p{L})或"whitespace"\s)。如果需要保留数字,请将其作为附加排除项重新添加。

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

这是an ideone demo

答案 1 :(得分: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 :(得分:2)

使用 \ p {L} (任何语言的任何类型的字母)替换正则表达式字符串中的 a-zA-Z

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

答案 3 :(得分: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("[\\?,.:!\\(\\){}\\[\\]<>%]", ""); 
    }
 }

答案 4 :(得分: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);
        }
    }
}

同样,可能不是最干净或最有效的,但它是目前我能想到的最好的。