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


73

我试图使用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;

我似乎找不到任何方法来删除所有非字母字符。我尝试过使用regexes和迭代器没有任何运气。谢谢你的帮助。

Answers:


131

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

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

最初在输入中留有空格,因此拆分仍将起作用。

通过拆分之前除去垃圾字符,可以避免循环遍历元素。


59
如果目标是消除标点符号,那会replaceAll("\\p{P}", "")更有意义吗?
VGR 2013年

4
是“å”字母吗?由于该字符将被删除。
亨迪·爱侣湾

8
@hendy是的,“å”是Unicode“字母”。我回答的是拉丁语。为了迎合任何字母,正则表达式为"[^\\p{L} ]",它使用POSIX表示法来表示“字母”。
波希米亚

4
我想知道Unicode意识是否应该成为大多数/初学者的“默认做法”?我的意思是说,美国/印度尼西亚的程序员在他们的“真实”生活中从未需要处理奇怪的字符。因此,他们的代码可能反映了这一点,因此即使他们使用UTF8,也无意间假设字母为AZ。土耳其或阿拉伯语的程序员OTOH首先将意识到这种情况,并寻求Unicode解决方案。你怎么看?(这只是侧面讨论)
Hendy Irawan

1
@ ilija139-当然,所有非字母/空格都将在第一步中删除。要保留位数太多,只需添加数字的字符被保留-即改变replaceAll("[^a-zA-Z0-9 ]", "")
波希米亚


8

您可以尝试以下方法:

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] 匹配非单词字符,因此上述正则表达式将匹配并删除所有非单词字符。


这不会替换数字。我猜这是非字母的。
罗希特·贾因

1
@RohitJain:-是的,我明白你的意思。但是我认为我们在语言中经常使用的标点符号。我采用了标点符号的字面意思!!!
拉胡尔·特里帕西

@RohitJain是的,我确实想删除数字。对于那个很抱歉。
TheDoctor 2013年

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();
}

它会循环遍历的底层内容char[]String并且仅在char字母或数字(如果要过滤掉所有符号,我假设这是您要完成的操作)后才附加,然后附加的小写版本char


2

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.