如何从Java中删除输入文本中的标点符号?

The*_*tor 58 java regex string formatting

我正在尝试使用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;
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到任何方法来删除所有非字母字符.我试过使用正则表达式和迭代器没有运气.谢谢你的帮助.

Boh*_*ian 103

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

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

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

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

  • 如果目标是删除标点符号,则不会'replaceAll("\\ p {P}","")``更有意义吗? (49认同)
  • @hendy是的,"å"是一个Unicode"字母".我回答了拉丁文的背景.为了满足*any*字母,正则表达式将是""[^ \\ p {L}]"`,它使用POSIX表示法来表示"字母". (7认同)
  • 我想知道Unicode认知是否应该成为大多数/初级程序员的"默认实践"?我的意思是,美国/印度尼西亚的程序员从来不需要在他们的"真实"生活中处理奇怪的人物.所以他们的代码可能反映了这一点,所以即使他们使用UTF8,也会出现字母为AZ的意外假设.土耳其或阿拉伯语程序员OTOH将首先识别这种情况并寻求Unicode解决方案.你怎么看?(这只是一个侧面的讨论) (4认同)
  • "å"是一封信吗?由于该角色将被删除. (2认同)
  • @ilija139 当然 - 所有非字母/空格都在第一步中被删除。要保留数字,只需在保留的字符中添加数字 - 即更改为`replaceAll("[^a-zA-Z0-9 ]", "")` (2认同)

rav*_*iru 11

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

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

inputString.replaceAll("\\p{Punct}", "");
Run Code Online (Sandbox Code Playgroud)


Rah*_*thi 6

您可以尝试以下方法:

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);
Run Code Online (Sandbox Code Playgroud)

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


Jos*_*h M 5

如果您不想使用 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();
}
Run Code Online (Sandbox Code Playgroud)

它通过循环的基本char[]String和唯一的追加char,如果它是一个字母或数字(过滤掉所有符号,我假设是您想要什么来完成),然后追加的小写版本char


Ner*_*zid 5

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

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

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