Pre:最近做了头条的在线笔试,对Scanner输入的处理有些特殊,当时是一脸懵逼态,遂由此随笔(/@_@\),java小白,有错难免!

  查了下Scanner的源码,没有头绪,但是其中用到了正则的知识,遂简单回顾下正则的使用:

Part1:正则使用简介                    

  1、正则表达式主要是针对字符串的一种规则(以字符串表示);主要功能有以下:

  • 匹配:注意是完全匹配, boolean matches(String regex)  (我之前总是一不小心就理解成包含contains)。
  • 切割:返回是字符串组,  String[] split(String regex)
  • 替换:多种替换方法如: String replace(char oldChar, char newChar)
  • 获取:需要Pattern类和Matcher类支持,
    • Pattern类:模式,字符串形式的正则首先被编译为此类的实例

      • static Pattern compile(String regex)//获取模式
      • Matcher matcher(CharSequence input)//获取匹配器
    • Matcher类:匹配器,解释Pattern并执行匹配操作。
      • boolean find()  //是否有下一个可匹配的子序列
      • String group()   //返回匹配的子序列
      • int end()        //返回最后一个匹配位置的下一个位置

  2、java实例:

public class Test {
public static void main(String[] args) {
String reg="abc";
String str="abcdefabcdefababc";
Pattern p=Pattern.compile(reg);
Matcher m=p.matcher(str);
while(m.find()){
System.out.println(m.group()+"起始于:"+m.start()+",结束于:"+(m.end()-1));
}
}
}
abc起始于:0,结束于:2
abc起始于:6,结束于:8
abc起始于:14,结束于:16

  3、常用的正则规则:具体可转:https://www.cnblogs.com/Jansens520/p/6915384.html

{}:表示次数 ; [a,b,c]{3,}:a,b,c中的一个出现至少3次  
[]:表示一个集合,可以是其中的任何一个字符; 预定义字符
. :任何字符;              
\d:数字0-9;            \D:非数字0-9即[^0-9];
\w:单词字符[a-zA-Z_0-9];    \W:非单词开头
\s:任何空白字符[<空格>\t\n\r\f\v];如"a\sc"可匹配"a c";   
\S: 非空白字符[^\s] 边界匹配:
^:行的开头           $:行的结尾
\A:仅匹配字符串开头       \Z:仅匹配字符串结尾  "\Aabc",“abc\Z”匹配“abc”;
\b:单词边界 "a\b!c"匹配“a!c”;\B:非单词边界
数量:
x?:x出现一次或一次也没有
x*:x出现0次或多次
x+:x出现1次或多次  组:
():表示组,每遇到“(”编号+1;
a(123|bcd){2}e:匹配“a123123e”不匹配"a123bcde",组要么是123,要么是bcd;

Part2:使用Scanner输入碰到的几个问题                   

  1、几个方法:

  • String next():从第一个有效字符(非空格、换行等)直到第一个分隔或结束符(空格或换行)
  • int nextInt():读取一个int类型
  • String nextLine():从当前开始直到行分隔符;

  2、nextInt与nextLine同时使用问题:

  问题:第一行输入m与n,以空格分开;然后连续m行;空行;连续n行?

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
int n=sc.nextInt();
      //sc.nextLine();//正确输入时添加该行,we3前加空行;
String[] str1=new String[m];
String[] str2=new String[n];
for(int i=0;i<m;i++){
str1[i]=sc.nextLine();
}
sc.nextLine();//跳过一行;
for(int i=0;i<n;i++){
str2[i]=sc.nextLine();
}
System.out.println(m+";"+n);
System.out.println(Arrays.toString(str1));
System.out.println(Arrays.toString(str2));
}
分析:这里跳过了一行,第一行nextInt读到2后,定位到换行符之前,nextLine()读取到换行符,所以是"",而不是we1;
因此想要正确改正:
输入:
2 2
we1
we2
we3
we4  输出: 2;2
[, we1]
[we3, we4]

nextInt与nextLine同时使用

   3、比较问题(字符串的==与equals问题):

  

  

  切记:要用equals不要用“==”;后者比较地址,两个""的地址不相同。

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int m=sc.nextInt();
String[] str1=new String[m];
sc.nextLine();
for(int i=0;i<m;i++){
str1[i]=sc.nextLine();
}
System.out.println(Arrays.toString(str1));
for(int i=0;i<m;i++){
if(str1[i]==("")){//
System.out.println("==检测到有空行");
}
if(str1[i].equals("")){
System.out.println("equals检测到有空行");
}
}
}
输入:
2 s
输出
[, s]
equals检测到有空行;

  为什么String不用"==",这是因为虽然值是一样的,但是量个""的地址不同;如下

        public static void main(String[] args) {
String str1=new String("");
String str2="";
//打印内存地址;
System.out.println(System.identityHashCode(str1));
System.out.println(System.identityHashCode(str1));
get();
}
private static void get(){
System.out.println(System.identityHashCode(""));
} 输出:
17225372
17225372
5433634

  

4、笔试时碰到过这样一个问题:

  

  题目没有说明Scanner输入的大小,也就是我们不知道会有多少个nextLine(),nextInt;我当时想用3中的方法:当检测到一个空行时,停止等待输入,执行后续代码:如下;

public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
ArrayList<String> list=new ArrayList<>();
boolean t=true;
while(t){
// if(sc.hasNext()) 该行必须要注释掉,否则即使输入空行,hashNext检测不到下一个输入标记而一直阻塞;
list.add(sc.nextLine());
if(list.get(list.size()-1).equals("")){
t=false;
list.remove(list.size()-1);
}
}
for(String s:list){
System.out.println(s);
}
System.out.println("有没有空行输出?"); }
粘贴输入:
asdasda
asdas asdasda
输出:
asdasda
asdas
有没有空行输出?

未规定输入行数的处理

以上是再做笔试时遇见的几个问题,后续碰到问题继续补充!  

Scanner几个问题与正则简介的更多相关文章

  1. python基础知识---正则

    一.python正则简介 python的re模块,让python能够支持perl正则 perl正则的字符集("."  "[abc]"   "(abc) ...

  2. iOS常用开发技巧

    iOS开发过程中,总有那么一些个小问题让人纠结,它们不会让程序崩溃,但是会让人崩溃.除此之外,还将分享一些细节现在我通过自己的总结以及从其他地方的引用,来总结一下一些常见小问题. 本篇长期更新,多积累 ...

  3. 正则表达式re模块

    正则表达式模块re 1. 正则简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言, (在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被 编译 ...

  4. python成长之路第三篇(2)_正则表达式

    打个广告欢迎加入linux,python资源分享群群号:478616847 目录: 1.什么是正则表达式,python中得正则简介 2.re模块的内容 3.小练习 一.什么是正则表达式(re) 正则表 ...

  5. Regular Expression Syntax

    python的正则表达式 正则表达式的概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规 ...

  6. 大数据入门第十四天——Hbase详解(二)基本概念与命令、javaAPI

    一.hbase数据模型 完整的官方文档的翻译,参考:https://www.cnblogs.com/simple-focus/p/6198329.html 1.rowkey 与nosql数据库们一样, ...

  7. Linux命令之----tree

    命令简介 tree命令的中文意思为“树”,功能是以树形结构列出指定目录下的所有内容,包括所有文件.子目录及子目录里的目录和文件. 命令格式 tree [option] [directory]tree ...

  8. python基础-6 正则表达式

    一 python正则简介 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现. 正则表达式模式被编译成一系列的字 ...

  9. SonarQube Scanner的配置与使用简介

    一.下载 下载地址: https://sonarsource.bintray.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.77 ...

随机推荐

  1. SpringBoot 自定义MessageConvert

    创建一个MessageConvert类,实现HttpMessageConvert接口 简单实现,只完成写功能.其他默认false package com.boot.converter; import ...

  2. Smartbi研究院分享:数据仓库的五大特点

    ​我先给大家举个例子,首先数据仓库,从字面上理解就可以感受到这是一个很大的空间,而且存储的物品很杂,里面会存放酱油.沐浴露.洗发精等物品,而数据库是存放酱油.盐等厨房用品,洗浴又是一个数据库.另外一个 ...

  3. 数据分析用这样的报表工具,秒杀Excel!

    报表工具是为满足公司对报表数据的业务需求,弥补第三方报表平台给项目开发定制报表的工作而自主研发的一个通用性强易于维护的web报表工具. 报表工具以NPOI基础架构,通过公司的REAP开发框架运用到所有 ...

  4. Spring Cloud Sleuth 和 Zipkin 进行分布式跟踪使用指南

    分布式跟踪允许您跟踪分布式系统中的请求.本文通过了解如何使用 Spring Cloud Sleuth 和 Zipkin 来做到这一点. 对于一个做所有事情的大型应用程序(我们通常将其称为单体应用程序) ...

  5. Google发布跨云Serverless管理平台Knative

    企业只要使用由Google与Pivotal.IBM.红帽和SAP等企业共同开发的跨云Serverless管理平台Knative,就能在支持Kubernetes的云平台上自由的迁移工作负载,无论是跨私有 ...

  6. 【基础知识】Intel CPU体系结构|x86是什么意思

    看了<计算机系统结构>.<深入理解计算机系统>.<大话处理器>等经典书籍,也在google上搜了一大堆资料,前前后后.断断续续的折腾了一个多月,终于想通了,现在把自 ...

  7. 使用Irony开发译码器

    使用Irony开发一个针对G代码的译码器.不想使用Lex&Yacc的原因是: 1.我只会用C#和Python写代码,用Lex&Yacc还得学习新的语法规范,我懒: 2.Lex& ...

  8. broken pipe 报错分析和解决办法

    参考资料: 1.博客1:https://blog.csdn.net/qq_37535749/article/details/113781338 2.博客2:https://blog.csdn.net/ ...

  9. JAVA_Scanner 键盘输入

    键盘输入语句 介绍:在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取.Input.java , 需要一个 扫描器(对象), 就是 Scanner 步骤: 导入该类的所在包, java.u ...

  10. 《手把手教你》系列基础篇(七十三)-java+ selenium自动化测试-框架设计基础-TestNG实现启动不同浏览器(详解教程)

    1.简介 上一篇文章中,从TestNg的特点我们知道支持变量,那么我们这一篇就通过变量参数来启动不同的浏览器进行自动化测试.那么如何实现同时启动不同的浏览器对脚本进行测试,且听宏哥娓娓道来. 2.项目 ...