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,我不理解问题所在?
答案 0 :(得分:1)
这是3个答案之一:
第一
当您从手下获得的任何字符使用正则表达式构建时,都应引用它:
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);
}