82

我正在尝试使用 Java 中用户的输入来获取一个句子,我需要将其设为小写并删除所有标点符号。这是我的代码:

    String[] words = instring.split("\\s+");
    for (int i = 0; i < words.length; i++) {
        words[i] = words[i].toLowerCase();
    }
    String[] wordsout = new String[50];
    Arrays.fill(wordsout,"");
    int e = 0;
    for (int i = 0; i < words.length; i++) {
        if (words[i] != "") {
            wordsout[e] = words[e];
            wordsout[e] = wordsout[e].replaceAll(" ", "");
            e++;
        }
    }
    return wordsout;

我似乎找不到任何方法来删除所有非字母字符。我尝试过使用正则表达式和迭代器,但没有成功。谢谢你的帮助。

4

5 回答 5

143

这首先删除所有非字母字符,折叠为小写,然后拆分输入,在一行中完成所有工作:

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+");

空格最初留在输入中,因此拆分仍然有效。

通过在拆分之前删除垃圾字符,您可以避免遍历元素。

于 2013-09-16T15:25:16.557 回答
31

您可以使用以下正则表达式构造

标点符号:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~ 之一

inputString.replaceAll("\\p{Punct}", "");
于 2018-03-30T04:46:42.513 回答
10

你可以试试这个:-

Scanner scan = new Scanner(System.in);
System.out.println("Type a sentence and press enter.");
String input = scan.nextLine();
String strippedInput = input.replaceAll("\\W", "");
System.out.println("Your string: " + strippedInput);

[^\w]匹配非单词字符,因此上面的正则表达式将匹配并删除所有非单词字符。

于 2013-09-16T14:51:10.127 回答
6

如果您不想使用 RegEx(考虑到您的问题,这似乎非常不必要),也许您应该尝试这样的事情:

public String modified(final String input){
    final StringBuilder builder = new StringBuilder();
    for(final char c : input.toCharArray())
        if(Character.isLetterOrDigit(c))
            builder.append(Character.isLowerCase(c) ? c : Character.toLowerCase(c));
    return builder.toString();
}

它循环遍历char[]. String_charchar

于 2013-09-16T14:53:21.907 回答
3

我不喜欢使用正则表达式,所以这是另一个简单的解决方案。

public String removePunctuations(String s) {
    String res = "";
    for (Character c : s.toCharArray()) {
        if(Character.isLetterOrDigit(c))
            res += c;
    }
    return res;
}

注意:这将包括字母和数字

于 2016-09-27T22:08:37.270 回答