正则表达式
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。
简单来说,正则表达式就是一个很牛逼的字符串处理工具。
正则在线工具 : https://c.runoob.com/front-end/854/?optionGlobl=global
正则表达式
正则表达式(Regular Expression)是一种用于处理文本模式匹配和搜索的强大工具。它使用特定的语法格式来定义要匹配的文本模式。
正则表达式的格式由各种字符和元字符组成,以下是常见的正则表达式元素:
1.字面量字符:表示要直接匹配的字符。例如,字母、数字、标点符号等都可以作为字面量字符。
2.元字符:表示具有特殊含义的字符。例如,. 表示匹配任意字符,\d 表示匹配一个数字字符等。
3.字符类:用方括号 [ ] 表示,用于指定一个字符集合。例如,[abc] 表示匹配字符 a、b 或 c 中的任意一个。
4.转义字符:用反斜杠 \ 来取消字符的特殊含义,使其成为字面量字符。例如,. 表示匹配句号字符 .。
5.重复限定符:用于指定某个字符或字符组合的重复次数。例如,* 表示前面的元素可以重复零次或多次,+ 表示至少重复一次,? 表示重复零次或一次。
6.边界匹配:用于指定匹配的位置。例如,^ 表示匹配字符串的开头,$ 表示匹配字符串的结束。
7.分组:用括号 ( ) 将一系列字符组合在一起,形成一个子表达式。可以对子表达式进行分组、捕获和应用修饰符等操作。
8.逻辑操作符:用于将多个表达式组合起来。例如,| 表示或操作,() 可以用于控制优先级。
这只是正则表达式语法的简要介绍,正则表达式还有很多其他的语法元素和特性,用于更复杂的模式匹配和搜索操作。学习和理解正则表达式的语法规则需要一些时间和实践,但一旦掌握,它可以成为处理文本的强大工具。
注意这个边界匹配需要注意用法
比如正则表达式中的 ^ 和 $ 符号是用于表示匹配字符串的开始和结束位置的锚点。
^[0-9]{5,12}$
:
- ^ 表示匹配字符串的开始位置。
- [0-9]{5,12} 表示匹配由 5 到 12 个数字组成的字符串。
- $ 表示匹配字符串的结束位置。 所以整个正则表达式
^[0-9]{5,12}$
匹配的是只包含 5 到 12 个数字的完整字符串。
[0-9]{5,12}
:
- [0-9] 表示匹配一个数字。
- {5,12} 表示匹配前面的元素(这里是一个数字)连续出现 5 到 12 次。 这个正则表达式 - - - [0-9]{5,12} 匹配的是在字符串中连续出现的 5 到 12 个数字序列,而不要求整个字符串完全匹配。
如果我们有一个目标字符串 “123456789”,使用^[0-9]{5,12}$
的正则表达式只会匹配整个字符串 “123456789”,因为它必须满足从开始到结束的条件。而使用 [0-9]{5,12} 的正则表达式将匹配两个连续出现的数字子序列 “12345” 和 “6789”。
总结一下,^[0-9]{5,12}$
表示匹配只包含 5 到 12 个数字的完整字符串,而 [0-9]{5,12} 表示匹配连续出现的 5 到 12 个数字子序列。
预定义字符
预定义字符 | 预定义字符 |
---|---|
. | 可以匹配任何字符 |
\d | 匹配 0~9 的所有数字 |
\D | 匹配非数字 |
\s | 匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等 |
\S | 匹配所有的非空白字符 |
\w | 匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_ |
\W | 匹配所有的非单词字符 |
正则表达式中的特殊字符
特殊字符 | 说明 |
---|---|
$ | 匹配一行的结尾。要匹配 $ 字符本身,请使用$ |
^ | 匹配一行的开头。要匹配 ^ 字符本身,请使用^ |
() | 标记子表达式的开始和结束位置。要匹配这些字符,请使用(和) |
[] | 用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用[和] |
{} | 用于标记前面子表达式的出现频度。要匹配这些字符,请使用{和} |
* | 指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用* |
+ | 指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用+ |
? | 指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用? |
. | 匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用. |
\ | 用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\ |
正则表达式所支持的合法字符
字符 | 解释 |
---|---|
X | 字符x(x 可代表任何合法的字符) |
\0mnn | 八进制数 0mnn 所表示的字符 |
\xhh | 十六进制值 0xhh 所表示的字符 |
\uhhhh | 十六进制值 0xhhhh 所表示的 Unicode 字符 |
\t | 制表符(“\u0009”) |
\n | 新行(换行)符(‘\u000A’) |
\r | 回车符(‘\u000D’) |
\f | 换页符(‘\u000C’) |
\a | 报警(bell)符(‘\u0007’) |
\e | Escape 符(‘\u001B’) |
\cx | x 对应的的控制符。例如,\cM匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。 |
正则表达式常用类
Pattern类
Pattern
类是 Java 中用于表示正则表达式模式的类。它提供了一组静态方法来编译和匹配正则表达式。
以下是 Pattern
类的一些常用方法:
1.compile(String regex)
:将给定的正则表达式编译为 Pattern 对象。该方法返回一个 Pattern 实例,可以重复使用来进行匹配操作。
2.matcher(CharSequence input)
:创建一个 Matcher 对象,用于对指定的输入字符串进行匹配操作。CharSequence 可以是 String、StringBuffer 或 StringBuilder 等类型。
3.matches(String regex, CharSequence input)
:用给定的正则表达式模式匹配整个输入字符串。返回一个布尔值,表示是否完全匹配。
4.split(CharSequence input)
:根据给定的正则表达式模式拆分输入字符串,并返回一个数组。
5.replaceFirst(String replacement, CharSequence input)
:使用给定的替换字符串替换输入字符串中第一个匹配的子序列。
6.replaceAll(String replacement, CharSequence input)
:使用给定的替换字符串替换输入字符串中所有匹配的子序列。
Matcher
Matcher
类是 Java 中用于执行正则表达式匹配操作的类。它与 Pattern 类一起使用,通过 Pattern.matcher(CharSequence input) 方法创建一个 Matcher 对象,然后可以使用该对象执行匹配操作。
以下是 Matcher 类的一些常用方法:
1.matches()
:尝试将整个输入序列与模式进行匹配,并返回一个布尔值表示是否完全匹配。
2.lookingAt()
:尝试将输入序列的开头与模式进行匹配,并返回一个布尔值表示是否部分匹配。
3.find()
:尝试在输入序列中查找下一个匹配的子序列,并返回一个布尔值表示是否找到匹配。
4.group()
:返回与上一次匹配操作所得到的匹配子序列。
5.start()
:返回前一次匹配操作的起始索引。
6.end()
:返回前一次匹配操作的结束索引。
7.replaceAll(String replacement)
:将匹配的子序列替换为指定的字符串,并返回替换后的结果。
8.appendReplacement(StringBuffer sb, String replacement)
:将匹配的子序列替换为指定的字符串,并将结果添加到 StringBuffer 中。
9.appendTail(StringBuffer sb)
:将剩余的输入添加到 StringBuffer 中。
下面是结合这两个类的代码案例
public class RegexDemo1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//
Pattern pattern = Pattern.compile("^[0-9]{5,12}$"); //正则的编译对象
while (true) {
System.out.println("请输入qq");
String s1 = in.nextLine();
Matcher matcher = pattern.matcher(s1);
System.out.println(matcher.matches()); //全部匹配
// System.out.println(s1.matches("^[0-9]{5,12}$"));
}
}
@Test
public void test1() {
//正则编译对象,只匹配一次可以使用matches方法
System.out.println(Pattern.matches("^[0-9]{5,12}$", "77546313")); //正则是否全部匹配
System.out.println(Pattern.matches("^[0-9]{5,12}$", "123456")); //正则是否全部匹配
System.out.println(Pattern.matches("^[0-9]{5,12}$", "333333")); //正则是否全部匹配
Pattern pattern = Pattern.compile("^[0-9]{5,12}$");
pattern.matcher("77546313").matches();
pattern.matcher("123456").matches();
pattern.matcher("333333").matches();
}
@Test
public void test2() {
//全部匹配
Pattern pattern = Pattern.compile("\\d{5,12}");
Matcher matcher = pattern.matcher("12345a34343434");
System.out.println(matcher.matches()); //全部匹配
}
@Test
public void test3() {
//全部匹配
Pattern pattern = Pattern.compile("\\d{5,12}");
Matcher matcher = pattern.matcher("12345a34343434abc9878989");
while (matcher.find()) {//查找匹配,如果匹配返回ture
String target = matcher.group();//得到上一次匹配的子序列
System.out.println(target + "-" + matcher.start() + "-" + matcher.end()); //start得到上一个匹配的索引开始
}
}
@Test
public void test4() {
String content =
"Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
+ "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
+ "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
+ "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";
Pattern pattern = Pattern.compile("([a-zA-Z]+) | (\\d+)");
Matcher matcher = pattern.matcher(content);
while (matcher.find()) {
String target = matcher.group(2); //0:全部的正则捕获组,1:的一个小括号的正则补货组
System.out.println(target);
}
}
@Test
public void test6() {
String content =
"Java 是由 Sun Microsystems 公司于 1995 年 5 月推出的高级程序设计语言。\n"
+ "Java 可运行于多个平台,如 windows,Mac OS 及其他多种 UNIX 版本的系统。\n"
+ "本教程通过简单的实例将让大家更好的了解 Java 编程语言。\n"
+ "移动操作系统 Android 大部分的代码采用 Java 编程语言编程。";
//创建一个Pattern对象
Pattern pattern = Pattern.compile("Java");
//创建一个匹配对象
Matcher matcher = pattern.matcher(content);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
//将Java替换为java后,将最后匹配到之前的子串都添加到sb对象中
matcher.appendReplacement(sb, "java");
System.out.println("sb:" + sb);
System.out.println("---------分割线-----------");
}
//将最后匹配到的子串添加到sb中
matcher.appendTail(sb);
System.out.println("sb: " + sb);
}
}
正则表达式的常见应用
1. 验证字符串是否全是汉字
Pattern pattern=Pattern.compile("^[\u0391-\uffe5]+$");
2. 验证字符串是否是邮编
Pattern pattern=Pattern.compile("^\\d{6}$");
3. 验证字符串是否是QQ号码
Pattern pattern=Pattern.compile("^[1-9]d{4,9}$");
4. 验证字符串是否是手机号码(要求:必须以13,14,15,18开头的11位数)
Pattern pattern=Pattern.compile("^1[3|4|5|8]\\d{9}$");
5. 验证字符串是否是url
Pattern pattern=Pattern.compile("^((http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$");
补充:
Java正则表达式默认是区分字母大小写的,如要实现不区分大小写
- (?i)abc表示abc都不区分大小写
- a(?i)bc表示bc不区分大小写
- a((?i)b)c表示只有b不区分大小写
- Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE);
//当创建Pattern对象时,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写
细节:Java匹配默认贪婪匹配,即尽可能匹配多的,比如"a{3,4}“,表示匹配aaa或者aaaa,但是优先匹配aaaa,例如原字符串中包括"aaaaaa”,匹配"a{3,4}“时,会找到"aaaa”