在子字符串上使用“预定义字符类”

时间:2012-01-31 14:28:36

标签: java regex

我想检查字符串的最后一个字符,使用'\ W'来表示不是非单词字符的字符,并允许某些符号如“。,!etc”从头顶我想到使用了代码与此类似。

Boolean notCompleted = true;
           int deduct = 1;
           while(notCompleted){
               if(string.charAt(string.length() -deduct) == '\W'){ // '\W' <-- doesn't work since it accepts anything other than "escape sequences".
                   if(string.charAt(string.length() -deduct) == '.'||string.charAt(string.length() -deduct) == ','||string.charAt(string.length() -deduct) == '!'){
                       //Do nothing and move on to the while loop
                   }else{
                       //Replace the non word character with ' '.
                   }
               }
               deduct++;
               if(deduct >= html.length()){
                   notCompleted = false;
               }
           }

这不起作用的原因是因为使用string.charAt只接受“Escapes sequence”。

  

我的问题是还有另一种方法来解决这个问题,而不是这样做。

string.replaceAll("\W", "");

非常感谢所有建议。谢谢。

感谢提示npinti给了我构建此代码。但是我得到一个错误行

所请求的fakeNewString的结果应为“!asdsdefwef。,a ,, sda.sd”;

fakeNewString = sb.toString(); // NullPointerException

public static void test5(){
        Boolean notCompleted = true;
        String fakeNewString = "!@#$%^&*( asdsdefwef.,a,,sda.sd";
        int start = 0, end = 1;
           StringBuilder sb = null;
           try{

        while(notCompleted){
               start++;
               String tempString = fakeNewString.substring(start, end);
               if(Pattern.matches("\\W$", tempString)){
                   if(Pattern.matches("!", tempString)||Pattern.matches(".", tempString)||Pattern.matches(",", tempString)||Pattern.matches("\"", tempString)){
                       //do nothing
                       sb.append(tempString);
                   }else{
                       //Change it to spaces.
                       tempString = " ";
                       sb.append(tempString);
                   }
               }
               end++;
               if(end >= fakeNewString.length()){
                   notCompleted = false;
                   fakeNewString = sb.toString();
                   System.out.println(fakeNewString);
               }
           }

       }catch (Exception e) {
        // TODO: handle exception
           e.printStackTrace();
       }
}

3 个答案:

答案 0 :(得分:2)

你可以这样做:

Pattern pattern = Pattern.compile("\\W$");
Matcher matcher = pattern.match(string);

if (matcher.find())
{
    //do something when the string ends with a non word character
}

有关正则表达式的更多信息,请查看this教程。

答案 1 :(得分:1)

您可以稍微不同的方式使用String.replaceAll来执行此操作。它实现了与您尝试编写的代码相同的效果,这似乎是解决简单问题的复杂解决方案。试试这段代码:

string.replaceAll("[^\\w!,.]", " ");

现在所有无效字符都被空格替换,并且多个连续出现的字符被多个空格替换。

答案 2 :(得分:1)

让我们试着打破问题(欲望)并回答它:

  

我想使用'\ W'检查字符串的最后一个字符是否为非单词字符,并允许某些符号如“。,!etc”


首先我们有:

  

我想检查字符串的最后一个字符

字符串X末尾的字符串表达式:

X$

然后:

  

表示不是非单词字符的字符

表达式:

[^\W],即\w

还有:

  

允许使用某些符号,例如“。,!etc”

添加到上面的表达式中:

[\w.,!]

最终结果是:

[\w.,!]$

钽哒! (虽然我猜OP正在寻找其他东西,我是为了它而做的。)