Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中删除输入文本中的标点符号?_Java_Regex_String_Formatting - Fatal编程技术网

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

如何在Java中删除输入文本中的标点符号?,java,regex,string,formatting,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(wor

我正在尝试使用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;
String[]words=instring.split(\\s+);
for(int i=0;i
我似乎找不到任何方法删除所有非字母字符。我尝试过使用正则表达式和迭代器,但运气不佳。谢谢您的帮助。

您可以尝试以下方法:-

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

如果您不想使用正则表达式(考虑到您的问题,这似乎非常不必要),也许您应该尝试以下方法:

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[]
,如果是字母或数字,则只追加
char
(过滤掉所有符号,我假设这就是您要完成的)然后附加小写版本的
字符

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

String[] words = instring.replaceAll("[^a-zA-Z ]", "").toLowerCase().split("\\s+");
空间最初保留在输入中,因此拆分仍然有效


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

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

public String removePunctuations(String s) {
    String res = "";
    for (Character c : s.toCharArray()) {
        if(Character.isLetterOrDigit(c))
            res += c;
    }
    return res;
}
注意:这将包括字母和数字

您可以使用以下内容

标点符号:其中之一!“#$%&'()*+,-./:?@[]^{124;}~


这不会替换数字。我想这属于非字母。@RohitJain:-是的,我明白你的意思。但我认为我们在语言中经常使用的标点符号。我理解标点符号的字面意思!!!@RohitJain是的,我确实想删除数字。很抱歉。如果目标是删除标点符号,我不会
replaceAll(\\p{p},“)
更有意义吗?“å”是一个字母吗?因为该字符将被删除。@hendy yes,“å”是一个Unicode“字母”。我回答的是拉丁语上下文。为了适应任何字母,正则表达式将是
“[^\\p{L}]”
,它使用POSIX符号表示“字母”。我想知道Unicode意识是否应该是一种“默认做法”“对于大多数/刚开始的程序员?我的意思是,美国/印尼的程序员在他们的“真实”生活中从来不需要处理奇怪的角色。所以他们的代码可能反映了这一点,所以即使他们使用UTF8,也会无意中假设字母是A-Z。土耳其或阿拉伯程序员OTOH会首先认识到这种情况,并寻求Unicode解决方案。你怎么认为?(这只是旁白)@ilija139当然-在第一步中删除所有非字母/空格。要保留数字,只需在保留的字符中添加数字即可-即更改为
replaceAll(“[^a-zA-Z0-9]”,“”)
inputString.replaceAll("\\p{Punct}", "");