3528. 字符串匹配
首先,使用动态数组ArrayList
存储字符串
其次,根据题意,“对于aa[123]bb
,字符串aa1bb
、aa2bb
、aa3bb
均可与其匹配”可知,短字符串p可以看作含有特殊意义[]
字符的字符串,因此可以将短字符串p看作一个正则表达式
在正则表达式中,可以使用
[]
括起来若干个字符表示一个字符。例如,[abc]
匹配字符 “a”、”b” 或 “c”。
然后,遍历数组,利用String类中的matches()
方法判断数组中的字符串变量是否与正则表达式(短字符p)匹配
最后,因为匹配时不区分大小写,所以将字符串变量全部转换为大写或者小写,正则表达式也应发生相应的变化
本题代码
import java.util.*;
public class Main {
public static void main(String[] args) {
List<String>strs=new ArrayList<String>(); //创建动态数组
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<=n;i++) {
String str=sc.nextLine();
strs.add(str); //数组中添加字符串
}
String regex=sc.nextLine().toLowerCase();
//输入正则表达式(短字符串p),并将其中的字母转化为小写
for(int i=0;i<=n;i++) {
if(strs.get(i).toLowerCase().matches(regex))
//判断数组中的字符串变量是否与正则表达式(短字符p)匹配
System.out.println((i)+" "+strs.get(i));
}
sc.close();
}
}
正则表达式
正则表达式是含有一些具有特殊意义的字符串,这些特殊字符被称为正则表达式中的元字符。正则表达式通常用于判断语句中,用来检查某一字符串是否满足某一格式。
简单来说,正则表达式是一种用于模式匹配和搜索文本的工具。
正则表达式语法
在其他的语言中,一个反斜杠\ 就足以具有转义的作用,而在 Java 中正则表达式中则需要有两个反斜杠才能被解析为其他语言中的转义作用。
System.out.print("\\"); // 输出为 \
System.out.print("\\\\"); // 输出为 \\
正则表达式元字符和特性
字符匹配
- 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 “a” 将匹配到文本中的 “a” 字符。
- 元字符:元字符具有特殊的含义,例如
\d
匹配任意数字字符,\w
匹配任意字母数字字符,.
匹配任意字符(除了换行符)等。
限定修饰符
限定修饰符 | 意义 | 示例 | 限定修饰符 | 意义 | 示例 |
---|---|---|---|---|---|
? | 0次或一次 | A? | {n} | 正好出现n次 | A{2} |
* | 0次或多次 | A* | {n,} | 至少出现n次 | A{2,} |
+ | 一次或多次 | A+ | {n,m} | 出现n~m次 | A{2,3} |
字符类
-
[ ]
:匹配括号内的任意一个字符。例如,[abc]
匹配字符 “a”、”b” 或 “c”。 -
[^ ]
:匹配除了括号内的字符以外的任意一个字符。例如,[^abc]
匹配除了字符 “a”、”b” 或 “c” 以外的任意字符。
eg1.判断”ABAB”形式的数字
输入一个4位数字,判断其是否为”ABAB”型的数字.
元字符
\\d
匹配0 ~ 9的任何一个数字
( )
:用于分组和捕获子表达式
\\1
匹配和第一个捕获组相同的内容
+
限定元字符出现的次数:一次或多次
eg1.代码
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个4位的数字:");
String numbers = sc.next();
if (numbers.length() == 4) {
boolean b = numbers.matches("(\\d+)\\1");
if (b) {
System.out.println(numbers + "是ABAB形式的数字!");
} else {
System.out.println(numbers + "不是ABAB形式的数字!");
}
} else {
System.out.println("请输入一个4位的数字!");
}
sc.close();
}
}
ArrayList类(动态数组)
java.util
包中提供了一些集合类,这些集合类又被称之为容器
。提到容器不难想到,它们的区别在于:数组的长度是固定的,集合的长度是可变的。常见的集合有List集合、Set集合和Map集合,其中List
集合和Set
集合继承Collection
接口。本题字符串数组中字符串的个数是可变的,所以使用ArrayList
类(即动态数组)
Collection接口
Collection
接口通常不能被直接使用,但该接口提供了一些实用的方法,这些方法对于List
集合和Set
集合是通用的。
方法 | 功能描述 |
---|---|
add() | 将指定对象添加到该集合中 |
isEmpty() | 判断该集合是否为空 |
size() | 获取集合中元素个数 |
Object[] toArray() | 返回一个包含集合中所有元素的数组 |
contains(Object o) | 判断该集合中是否包含某对象 |
remove(Object o) | 将指定对象移除该集合 |
List接口
List
接口继承了Collection
接口,因此包含Collection
接口中的所有方法
List
接口常用的实现类有ArrayList
类和LinkedList
类,以下仅介绍ArrayList
类
ArrayList类
ArrayList
类是一个可以动态修改的数组,没有固定大小的限制,可以添加或删除元素。
初始化
ArrayList<E>ObjectName=new ArrayList<>(); //初始化
//E是泛型参数,用于表示ArrayList中存储的元素的数据类型。可以是任何引用数据类型,例如String、Integer等
添加元素
使用 add() 方法:
ArrayList<String>strs=new ArrayList<>();
strs.add("Welcome to China!");
访问元素
使用 get() 方法:
ArrayList<String>strs=new ArrayList<>();
strs.add("Welcome to China!");
strs.get(0); //访问第一个元素
与数组相同,集合的索引也是从0开始的