Java 正则表达式、方法、stream、file、IO、Scanner类

一、Java 正则表达式:

正则表达式定了字符串的模式,用来搜索、编辑或处理文本。正则表达式的实例及描述:

|----------------------------|--------------------------------------------------------------------------------------------------------------------------------------|
| 正则表达式 | 描述 |
| this is text | 匹配字符串 "this is text" |
| this\s+is\s+text | 注意字符串中的 \s+。 匹配单词 "this" 后面的 \s+ 可以匹配多个空格,之后匹配 is 字符串,再之后 \s+ 匹配多个空格然后再跟上 text 字符串。 可以匹配这个实例:this is text |
| ^\d+(\.\d+)? | ^ 定义了以什么开始 \d+ 匹配一个或多个数字 ? 设置括号内的选项是可选的 \. 匹配 "." 可以匹配的实例:"5", "1.5" 和 "2.21"。 |

正则表达式语法:

在 Java 中,\\ 表示:我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义。

|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 字符 | 说明 |
| \ | 将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如, n 匹配字符 n \n 匹配换行符。序列 \\\\ 匹配 \\ \\( 匹配 ( |
| ^ | 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与"\n"或"\r"之后的位置匹配。 |
| **** | ****匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性, 还会与"\n"或"\r"之前的位置匹配。 |
| * | 零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。 |
| + | 一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。 |
| ? | 零次或一次匹配前面的字符或子表达式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效于 {0,1}。 |
| { n } | n 是非负整数。正好匹配 n 次。例如,"o{2}"与"Bob"中的"o"不匹配,但与"food"中的两个"o"匹配。 |
| { n ,} | n 是非负整数。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的所有 o。"o{1,}"等效于"o+"。"o{0,}"等效于"o*"。 |
| { n , m } | m n 是非负整数,其中 n <= m 。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的头三个 o。'o{0,1}' 等效于 'o?'。注意:您不能将空格插入逗号和数字之间。 |
| ? | 当此字符紧随任何其他限定符(*、+、?、{ n }、{ n ,}、{ n , m })之后时,匹配模式是"非贪心的"。"非贪心的"模式匹配搜索到的、尽可能短的字符串,而默认的"贪心的"模式匹配搜索到的、尽可能长的字符串。例如,在字符串"oooo"中,"o+?"只匹配单个"o",而"o+"匹配所有"o"。 |
| . | 匹配除"\r\n"之外的任何单个字符。若要匹配包括"\r\n"在内的任意字符,请使用诸如"[\s\S]"之类的模式。 |
| ( pattern ) | 匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从结果"匹配"集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用"\("或者"\)"。 |
| (?: pattern ) | 匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用"or"字符 (|) 组合模式部件的情况很有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更经济的表达式。 |
| (?= pattern ) | 执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| (?! pattern ) | 执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后。 |
| x | y | 匹配 x y 。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。 |
| [ xyz ] | 字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
| [^ xyz ] | 反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
| [ a-z ] | 字符范围。匹配指定范围内的任何字符。例如,"[a-z]"匹配"a"到"z"范围内的任何小写字母。 |
| [^ a-z ] | 反向范围字符。匹配不在指定的范围内的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"范围内的任何字符。 |
| \b | 匹配一个字边界,即字与空格间的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。 |
| \B | 非字边界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。 |
| \c x | 匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回车符。 x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定 c 就是"c"字符本身。 |
| \d | 数字字符匹配。等效于 [0-9]。 |
| \D | 非数字字符匹配。等效于 [^0-9]。 |
| \f | 换页符匹配。等效于 \x0c 和 \cL。 |
| \n | 换行符匹配。等效于 \x0a 和 \cJ。 |
| \r | 匹配一个回车符。等效于 \x0d 和 \cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效。 |
| \S | 匹配任何非空白字符。与 [^ \f\n\r\t\v] 等效。 |
| \t | 制表符匹配。与 \x09 和 \cI 等效。 |
| \v | 垂直制表符匹配。与 \x0b 和 \cK 等效。 |
| \w | 匹配任何字类字符,包括下划线。与"[A-Za-z0-9_]"等效。 |
| \W | 与任何非单词字符匹配。与"[^A-Za-z0-9_]"等效。 |
| \x n | 匹配 n ,此处的 n 是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,"\x41"匹配"A"。"\x041"与"\x04"&"1"等效。允许在正则表达式中使用 ASCII 代码。 |
| \ num | 匹配 num ,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,"(.)\1"匹配两个连续的相同字符。 |
| \ n | 标识一个八进制转义码或反向引用。如果 \ n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码。 |
| \ nm | 标识一个八进制转义码或反向引用。如果 \ nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \ nm 前面至少有 n 个捕获,则 n 是反向引用,后面跟有字符 m 。如果两种前面的情况都不存在,则 \ nm 匹配八进制值 nm ,其中 n m 是八进制数字 (0-7)。 |
| \nml | n 是八进制数 (0-3), m l 是八进制数 (0-7) 时,匹配八进制转义码 nml |
| \u n | 匹配 n ,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (©)。 |

二、Java方法:

Java方法是语句的集合,一起执行一个功能。方法是解决一类问题的步骤的有序组合;方法包含于类或对象中;方法在程序中被创建,在其他地方被引用。

方法的命名规则:方法的名字的第一个单词应以小写字母做开头,后面的单词则用大写字母开头写。不使用连接符;下划线可能出现在JUnit测试方法名称中用以分隔名称的逻辑组件。

方法的定义:

修饰符 返回值类型 方法名(参数类型 参数名){

...

方法体

...

return 返回值;

}

其中修饰符:可选,告诉编译器如何调用该方法,定义该方法的访问类型;返回值,有些方法有返回值,有些方法没有返回值;当方法被调用时,传递值给参数,方法可以有参数,也可以不包含参数;方法体包含具体的雨具,定义该方法的功能。

三、Java stream、file、IO、Scanner类:

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。

18.1、读取控制台输入:

为了获得一个绑定到控制的字符流,用BufferedReader 对象创建字符流,BufferedReader的基本语法:

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

使用read()方法读取一个字符:

int read( ) throws IOException

使用readLine()方法读取一个字符串:

String readLine( ) throws IOException

18.2、控制台输出:

OutputStream类write()方法用来往控制台写操作:

void write(int byteval)

18.3、读写文件:

FileInputStream流用于从文件读取数据,它的对象可以用关键字new来创建:

InputStream f = new FileInputStream("C:/java/hello");

File f = new File("C:/java/hello");

InputStream in = new FileInputStream(f);

创建InputStream对象,使用下面的方法读取流或其他流操作:

|------------|-------------------------------------------------------------------------------------------------------------------------|
| 序号 | 方法及描述 |
| 1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
| 2 | protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
| 3 | public int read(int r)throws IOException{} 这个方法从 InputStream 对象读取指定字节的数据。返回为整数值。返回下一字节数据,如果已经到结尾则返回-1。 |
| 4 | public int read(byte[] r) throws IOException{} 这个方法从输入流读取r.length长度的字节。返回读取的字节数。如果是文件结尾则返回-1。 |
| 5 | public int available() throws IOException{} 返回下一次对此输入流调用的方法可以不受阻塞地从此输入流读取的字节数。返回一个整数值。 |

FileOutputStream流用来创建一个文件并向文件中写入数据。创建输出流对象:

OutputStream f = new FileOutputStream("C:/java/hello")

File f = new File("C:/java/hello");

OutputStream fOut = new FileOutputStream(f);

创建OutputStream 对象后,使用下面的方法写入流或其他流操作:

|------------|-------------------------------------------------------------------------------------------------------------------------|
| 序号 | 方法及描述 |
| 1 | public void close() throws IOException{} 关闭此文件输入流并释放与此流有关的所有系统资源。抛出IOException异常。 |
| 2 | protected void finalize()throws IOException {} 这个方法清除与该文件的连接。确保在不再引用文件输入流时调用其 close 方法。抛出IOException异常。 |
| 3 | public void write(int w)throws IOException{} 这个方法把指定的字节写到输出流中。 |
| 4 | public void write(byte[] w) 把指定数组中w.length长度的字节写到OutputStream中。 |

18.4、文件和I/O:

File Class类、FileReader Class类、FileWriter Class类

18.5、创建目录:

mkdir()-创建一个文件夹,成功返回true,失败返回false;

mkdirs()-创建一个文件夹和它所有父文件夹。

import java.io.File;

public class CreateDir {

public static void main(String[] args) {

String dirname = "/tmp/user/java/bin";

File d = new File(dirname);

// 现在创建目录

d.mkdirs();

}

}

18.6、读取目录:

通过list()方法,来提取它包含的文件和文件夹的列表:

import java.io.File;

public class DirList {

public static void main(String args[]) {

String dirname = "/tmp";

File f1 = new File(dirname);

if (f1.isDirectory()) {

System.out.println("目录 " + dirname);

String s[] = f1.list();

for (int i = 0; i < s.length; i++) {

File f = new File(dirname + "/" + s[i]);

if (f.isDirectory()) {

System.out.println(s[i] + " 是一个目录");

} else {

System.out.println(s[i] + " 是一个文件");

}

}

} else {

System.out.println(dirname + " 不是一个目录");

}

}

}

18.7、删除目录和文件:

删除文件可以使用 java.io.File.delete() 方法。

import java.io.File;

public class DeleteFileDemo {

public static void main(String[] args) {

// 这里修改为自己的测试目录

File folder = new File("/tmp/java/");

deleteFolder(folder);

}

// 删除文件及目录

public static void deleteFolder(File folder) {

File[] files = folder.listFiles();

if (files != null) {

for (File f : files) {

if (f.isDirectory()) {

deleteFolder(f);

} else {

f.delete();

}

}

}

folder.delete();

}

}

18.8、获取用户输入:

Java.util.Scanner类用来获取用户的输入(通过Scanner类的next()和nextline()方法获取输入的字符串)。Scanner对象的基本语法:

Scanner s = new Scanner(System.in);

使用next()方法:

import java.util.Scanner;

public class ScannerDemo {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

// 从键盘接收数据

// next方式接收字符串

System.out.println("next方式接收:");

// 判断是否还有输入

if (scan.hasNext()) {

String str1 = scan.next();

System.out.println("输入的数据为:" + str1);

}

scan.close();

}

}

使用nextline()方法:

import java.util.Scanner;

public class ScannerDemo {

public static void main(String[] args) {

Scanner scan = new Scanner(System.in);

// 从键盘接收数据

// nextLine方式接收字符串

System.out.println("nextLine方式接收:");

// 判断是否还有输入

if (scan.hasNextLine()) {

String str2 = scan.nextLine();

System.out.println("输入的数据为:" + str2);

}

scan.close();

}

}

next()和nextline()的区别:

next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格,next()方法会自动将其去掉,只有输入有效字符后才将其后面输入的空格作为分隔符或者结束符,next()不能得到带有空格的字符串;nextline()以enter为结束符,即nextline()方法返回的是输入回车之前的所有字符,可以获得空格。

相关推荐
陈大爷(有低保)3 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
阿华的代码王国14 分钟前
MySQL ------- 索引(B树B+树)
数据库·mysql
kinlon.liu17 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓38 分钟前
Linux通过yum安装Docker
java·linux·docker
java66666888842 分钟前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存43 分钟前
源码分析:LinkedList
java·开发语言
执键行天涯44 分钟前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
liupenglove1 小时前
golang操作mysql利器-gorm
mysql·golang
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode