为什么我编写的程序没有标记就无法获取字符串?

时间:2018-12-28 09:09:30

标签: java string

 Scanner scan = new Scanner(System.in);
 String s = scan.nextLine();
 Queue q=new LinkedList();
 for(int i=0;i<s.length();i++){
     int x=(int)s.charAt(i);
     if(x<65 || (x>90 && x<97) || x>122) {
         q.add(s.charAt(i));
     }
 }
 System.out.println(q.peek());
 String redex="";
 while(!q.isEmpty()) {
     redex+=q.remove();
 }
 String[] x=s.split(redex,-1);
 for(String y:x) {
     if(y!=null)
         System.out.println(y);
 }

 scan.close();

我正在尝试打印字符串“我的名字是NLP,所以我可以工作:fine;“是”。没有 {[]} + -_)*&%$ 之类的标记,但是它只是按原样打印所有String,我不理解问题所在?

2 个答案:

答案 0 :(得分:1)

这是3个答案之一:

  • 针对您的最初问题
  • 对于不使用正则表达式的解决方案
  • 要正确使用Scanner(这取决于您)。

第一

当您从手下获得的任何字符使用正则表达式构建时,都应引用它:

String[] x=s.split(Pattern.quote(redex),-1);

那将是常见的问题,但是第二个问题是您正在构建一个正则表达式范围,但是您省略了[]范围,因此它可以按原样工作:

String[] x=s.split("[" + Pattern.quote(redex) + "]",-1);

这个可能有效,但是如果Pattern.quote不引用-并且在两个范围如:-

这意味着:范围从$-!开始的$中的字符。如果范围无效并且我的示例可能无效(!可能在$之后),则可能会失败。

最后,您可以使用:

!

此正则表达式应与不需要的字符匹配。

第二:

对于其他情况,另一个答案指出了另一个问题:您没有使用String redex = q.stream() .map(Pattern::quote) .collect(Collectors.joining("|")); 方法来检查有效字符。

首先,请注意某些方法不使用Character.isXXX,而是使用代码点。例如,isAlphabetic使用代码点。代码点只是多字节编码中字符的表示。有一些Unicode字符需要两个char

第二,我认为您的问题在于您没有使用正确的工具来分词。

在伪代码中,这应该是:

char

这将: -查找从单词到非单词的过渡并更改偏移量(我们从此处开始) -在列表中添加单词 -将最后一个标记添加为结束词。

最后

或者,您也可以使用List<String> words = new ArrayList<>(); int offset = 0; for (int i = 0, n = line.length(); i < n; ++i) { // if the character fail to match, then we switched from word to non word if (!Character.isLetterOrDigit(line.charAt(i)) { if (offset != i) { words.add(line.substring(offset, i)); } offset = i + 1; // next char } } if (offset != line.length()) { words.add(line.substring(offset)); } 类,因为它允许您为其Scanner输入自定义定界符:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

我引用了javadoc类:

  

扫描仪还可以使用除空格以外的定界符。这个   该示例从字符串中读取多个项目:

hasNext()

您猜到了,您可以传递任何定界符,然后使用 String input = "1 fish 2 fish red fish blue fish"; Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*"); System.out.println(s.nextInt()); System.out.println(s.nextInt()); System.out.println(s.next()); System.out.println(s.next()); s.close(); hasNext()仅获得有效的单词。

例如,使用next()会在每次非字母/数字转换时拆分。

答案 1 :(得分:0)

如评论中所述,条件x<65将捕获您不感兴趣的所有特殊字符。使用Character的内置方法将有助于您在更清晰,无错误的方式:

x = s.charAt(i);
if (Character.isLetter(x) || Character.isWhiteSpace(x)) {
    q.add(x);
}