2016-07-04 82 views
1

我需要的是逃避一个字符串中的每个单词,并逃避每个特殊字符,如:!,?._'@。我已经试过是这样的:如何从字符串中跳出 s(空格字符)?

public class Solution 
{ 
    public static void main(String[] args) 
    {  
     Scanner scan = new Scanner(System.in); 
     Pattern pat = Pattern.compile("[!|,|?|.|_|'|@]"); 
     String a = scan.nextLine(); 
     scan.close(); 
     String[] part = pat.split(a); 
     System.out.println(part.length); 
     for(String p: part) 
      System.out.println(p); 
    } 
} 

虽然这确实逃避特殊字符,我不能设法找到一种方法,有正则表达式匹配的每个单词之间的空格。 另外,我试过在正则表达式之后使用\s\\s

对于输入像:The dog is a very lazy dog, isn't he?
输出应为:

The 
dog 
is 
a 
very 
lazy 
dog 
isn 
t 
he 

回答

2

[..]character class其描述了用于单个字符范围,而不是两个字符(我们可以允许像+*{nim,max}但与量词字符的重复在这里不是这种情况)。

你也不需要使用|里面[..],因为它是简单的字符,而不是OR运算符。所以[a|b]并不意味着a OR b,它代表字符a|b(所以像|c|任何重复将代表另一|c)。

基于例如你提供,你可能会寻找:

Pattern pat = Pattern.compile("[!,?._'@\\s]+"); 

或因为这可能是更具可读性

Pattern pat = Pattern.compile("([!,?._'@]|\\s)+"); 

您可能需要使用运营商之外的[..]OR|\s作为"\\s因为\也是字符串文字中的特殊字符(它可以用于例如创建制表符\t),所以它需要逃脱。

我用(..)包裹了整个表达式来创建可代表所有分隔符的组。这允许我使用+(量词表示“一个或多个事件”),所以现在你的正则表达式可以看到,.作为单独的分隔符,这将确保一个分割整个表达式的几个连续的分隔符,而不是分别分开每个分隔符。所以,而不是"a,.b" - >["a, "", "b"]现在我们将得到["a", "b"]

+0

我认为你是对的“|”字符。但是这仍然不能逃避字符串中的每个空间。 –

+0

“逃避串中的每个空间”是什么意思?你能否更新你的问题并发布你的意见和预期结果? – Pshemo

+0

@MinaF让我知道编辑过的版本是否适合你。如果确实会尝试添加解释。 – Pshemo

相关问题