目录
一、字符与字符串
二、字符串对象与自变量
三、正则表达式
1.普通字符
2.特殊字符
3.非打印字符
4.限定符
5.定位符
四、正则表达式的处理
1.Pattern.compile(String regex)
2.Matcher.matches()
3.Matcher.find()
4.Matcher.replaceAll(String replacement)
五、字符串的连接
六、字符串的比较
七、字符串的长度
一、字符与字符串
字符类型(char)是Java中的基本数据类型之一,字符是用单引号引起来的单个字符。字符串是用双引号引起来的任意个字符,字符串就是字符组成的序列。
package characterString;
import java.util.Random;
public class Password {
public static void main(String[] args) {
/*
随机生成一个6位密码,要求:
不包含重复字符
要有字母和数字
不能以数字开头
*/
String pass = rand(6);
System.out.println(pass);
}
public static String rand(int length) {
String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String[] arr = characters.split("");
Random random = new Random();
// 第一个是字母
int index = random.nextInt(52);
StringBuilder sb = new StringBuilder(arr[index]);
boolean hasNum = false; // 是否有数字
for (int i = 1; i < length; ) {
// 随机字符下标
index = random.nextInt(arr.length);
// 判断在字符串中有没有
if (sb.indexOf(arr[index]) == -1) {
if (index >= 52 ){
hasNum = true;
}
sb.append(arr[index]);
i++;
}
}
// String reg = "^[a-zA-Z]+\\d+\\w*$";
String str = sb.toString();
if (!hasNum){
// 说明没数字
int num = random.nextInt(10);
int repIndex = random.nextInt(1,length) ;
str = str.replaceFirst(str.charAt(repIndex) + "", String.valueOf(num));
}
return str;
}
}
二、字符串对象与自变量
字符串的声明有两种形式:
String 变量名="初始值";
String 变量名=new String("初始值");
第一种形式叫字面量,第二种使用new关键字声明的字符串叫做字符串对象。
三、正则表达式
一种字符串处理的工具,用于查找、替换、匹配和提取文本中的模式。
正则表达式有一些特殊字符和普通字符组成,例如:\d{3}-\d{4}可以匹配“123-4567”的字符串,\d表示数字字符,{3}表示连续匹配3次,-表示匹配一个横线。
1.普通字符
[abc] | 匹配[]中的所有字符,例如[aeiou]匹配字符串“google runoob taobao”中所有的a e i o u字母 |
[^ABC] | 匹配除了[]中所有的字母,例如[^aeiou]匹配字符串“google runoob taobao”中除了a e i o u所有的字母 |
[^a-z] | 匹配除了[]以外的字符 |
[A-Z] | 表示一个区间,匹配所有大写字母,[a-z]表示所有小写字母 |
. | 匹配任意单个字符,但不包括换行符,相等于[^\n\r] |
[\s\S] | 匹配所有,\s是匹配所有空白符,包括换行,\S非空白符,不包括换行 |
\w | 匹配数字、字母、下划线,等价于[A-Za-z0-9] |
2.特殊字符
要匹配特殊字符,必须首先使字符“转义”,即,将反斜杠字符\放在它们的前面。
$ | 匹配输入字符串的结束位置。 |
() | 标记一个子表达式的开始和结束位置。要匹配这些字符,请使用\(和\) |
* | 匹配前面的子表达式0次或多次。要匹配这些字符,请使用\* |
+ | 匹配前面的子表达式1次或多次。要匹配这些字符,请使用\+ |
. | 匹配除换行符之外的任意单字符。\. |
[ | 标记一个中括号表达式的开始。\[ |
? | 匹配前面的子表达式0次或1次。\? |
\ | 将下一个字符标记为特殊字符,或原义字符、或向后引用、或八进制转义符。 |
^ | 匹配输入字符串的开始位置,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。\^ |
{ | 标记限定符表达式的开始。\{ |
| | 指明两项之间的一个选择。\| |
3.非打印字符
\cx | 匹配由x指明的控制字符。x的值必须是A-Z或a-z之一,否则将视作一个原义的'c'字符 |
\f | 匹配一个换页符。 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配任何空白字符,包括空格、制表符、换页符等等 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
4.限定符
* | 匹配0个或多个字符a,例如ab*能匹配“a”以及“abb”。 |
+ | 匹配前面的表达式1次或多次 |
? | 匹配前面的表达式0次或1次 |
{n} | n是一个非负整数,匹配确定的n次 |
{n,} | n是一个非负整数,至少匹配n次 |
{n,m} | m和n均为非负整数,n<=m,最少匹配n次且最多匹配m次 |
5.定位符
^ | 匹配输入字符串开始的位置 |
$ | 匹配输入字符串结尾的位置 |
\b | 匹配一个单词边界,即字与空格间的位置 |
\B | 非单词边界匹配 |
四、正则表达式的处理
1.Pattern.compile(String regex)
将正则表达式编译成一个Pattern对象,regex是一个字符串类型的正则表达式。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
String regex="\\d+";//匹配数字
Pattern pattern=Pattern.compile(regex);
String text="hello 123 world";
Matcher matcher=pattern.matcher(text);
while (matcher.find()){
System.out.println(text+"匹配的结果是:"+matcher.group());
}
}
}
2.Matcher.matches()
用于判断给定字符串是否与正则表达式匹配,返回一个布尔值。
3.Matcher.find()
用于在给定字符串中查找匹配正则表达式的子序列,返回一个布尔值,如果找到,则使用group方法获取匹配的子序列。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
Pattern pattern=Pattern.compile("\\d\\d\\d");
Matcher matcher=pattern.matcher("a123b");
System.out.println(matcher.find());//输出结果true
}
}
4.Matcher.replaceAll(String replacement)
用于在给定正则表达式中替换正则表达式的子序列,replacement是一个字符串类型的替换字符串。
五、字符串的连接
字符串可以进行加法运算,作用是将两个字符串连接到一起,也可以将字符串与基本数据类型变量做加法运算,系统会先将基本数据类型转换成字符串型后进行连接操作。
将两个字符串连接到一起可以用加号连接,也可以使用concat()方法连接。
public class Main {
public static void main(String[] args) {
String firstName="李";
String lastName="逵";
String fullName=firstName+lastName;
System.out.println("姓名是:"+fullName);//姓名是:李逵
}
}
public class Main {
public static void main(String[] args) {
String firstName="李";
String lastName="逵";
String fullName=firstName.concat(lastName);
System.out.println("姓名是:"+fullName);//姓名是:李逵
}
}
六、字符串的比较
字符串进行比较时不能直接用“==”运算符,而是要使用equals()方法进行比较。
重要提示:
equals都是用于比较两个对象的操作:
①==操作符用于比较两个对象的引用是否指向同一内存地址。
②equals()方法用于比较两个对象的值是否相等。默认情况下,equals()方法比较两个对象的引用是否相等,但可以通过重写该方法来实现自定义的相等比较逻辑。
③对于基本数据类型,==操作符比较的是它们的值。
七、字符串的长度
String类的length()方法可以获取字符串是由多少个字符组成的。
package structure;
import java.util.Scanner;
public class AA {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入用户名:");
String name=sc.next();
if (name.length()>=6&&name.length()<=20){
System.out.println("用户名长度合法");
}else {
System.out.println("用户名长度不合法");
}
}
}
在数组中length属于数组的属性,在字符串中length()是字符串的方法。