Java正则表达式(全面回忆)

编程入门 行业动态 更新时间:2024-10-24 07:32:52

Java<a href=https://www.elefans.com/category/jswz/34/1770561.html style=正则表达式(全面回忆)"/>

Java正则表达式(全面回忆)

刷算法题看到一个正则表达式:

".*(.{3,}).*\\1.*" 表示匹配长度 >=3 的重复子字符串

我发现正则表达式很久没用,忘了很多,无法理解这个,于是又找了视频教程整体学习了一遍,以下是具体的学习内容与代码,可以帮助快速全面回忆java正则表达式的内容。

1、Java正则表达式

import java.util.regex.Matcher;
import java.util.regex.Pattern;public class PatternTest {public static void main(String[] args) {// \\1 是用来引用第一个捕获组(也就是第一个圆括号中的内容)的。// 可以使用多对圆括号来创建多个捕获组,并通过 \\1、\\2、\\3 等来引用它们。// (.)\\1 表示匹配两个连续的相同字符
//        Matcher matcher = Patternpile("(.)\\1").matcher("11312aabcdd");
//        while (matcher.find()) System.out.println(matcher.group(0));//匹配所有字母// [abcd]表示匹配里面字符中的任意一个字符,[^abcd]表示匹配除了abcd以外的任意一个字符// [A-Z] 表示匹配任意单个大写的字母,还有 [a-z]  [0-9]
//        Matcher matcher = Patternpile("[a-zA-Z]+").matcher("1995年,互联网的蓬勃发展给了Oak机会。");
//        while (matcher.find()){
//            System.out.println(matcher.group());
//        }//匹配所有数字
//        Matcher matcher = Patternpile("[0-9]+").matcher("1995年,互联网的蓬勃发展给了Oak机会。");
//        while (matcher.find()){
//            System.out.println(matcher.group());
//        }//匹配所有数字和字母
//        Matcher matcher = Patternpile("[0-9a-zA-Z]+").matcher("1995年,互联网的蓬勃发展给了Oak机会。");  //or ([0-9]+)|([a-zA-Z]+)
//        while (matcher.find()){
//            System.out.println(matcher.group());
//        }//group(0)表示返回匹配到的整个字符串内容;n不为0时,group(n)表示第n个括号里面匹配到的内容
//        Matcher matcher = Patternpile("我叫(\\S*);我叫(\\S*);我叫(\\S*);").matcher("我叫xxx,我来自南京;我叫zhao,我来自北京;我叫lu,我来自上海;");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//            System.out.println(matcher.group(1));
//            System.out.println(matcher.group(2));
//            System.out.println(matcher.group(3));
//        }//非命名分组:
//        Matcher matcher = Patternpile("(\\d\\d)(\\d\\d)").matcher("1995年,12345test12345678");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//            System.out.println(matcher.group(1));
//            System.out.println(matcher.group(2));
//        }//命名分组:通过 ?<name> 为分组命名
//        Matcher matcher = Patternpile("(?<c1>\\d\\d)(?<c4>\\d\\d)").matcher("1995年,12345test12345678");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//            System.out.println(matcher.group("c1"));// or matcher.group(1)
//            System.out.println(matcher.group("c4"));//or matcher.group(2)
//        }//特别分组:这里的()是非捕获的,也就是括号中的内容不会被 group(n)(n>=1) 捕获// (?:pattern): 比如可用 "industr(?:y|ies)" 取代 "industry|industries"// (?=pattern): 比如可用 "Windows (?=95|98|NT|2000)" 可匹配 "Windows 2000"中的"Windows",但不匹配 "Windows 3.1"中的"Windows"// (?!pattern): 比如可用 "Windows (?!95|98|NT|2000)" 可匹配 "Windows 3.1"中的"Windows",但不匹配 "Windows 2000"中的"Windows"
//        Matcher matcher = Patternpile("Windows (?=95|98|NT|2000)").matcher("Windows 2000 和 Windows 3.1");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }//匹配 IP 地址 (\\d匹配单个数字字符,相当于[0-9],\\.表示匹配小数点,+表示至少有一个)
//        String str3 = "原本属于A类地址范围内的IP地址127.0.0.0~127.255.255.255却并没有包含在A类地址之内。任何一个以数字127开头的IP地址(127.x.x.x)都叫做回送地址。它是一个保留地址,最常见的表示形式为127.0.0.1。在每个主机上对应于IP地址127.0.0.1有个接口,称为回送接口。";
//        Matcher matcher = Patternpile("\\d+\\.\\d+\\.\\d+\\.\\d+").matcher(str3);
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }//匹配四位数(匹配过的数字不再匹配,如:12345匹配出1234,12345678匹配出1234和5678)
//        Matcher matcher = Patternpile("\\d\\d\\d\\d").matcher("1995年,12345test12345678");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }// \\表示转义 特殊符号的匹配,如\\$、\\(、\\)// .表示匹配所有字符,\\.表示匹配点号
//        Matcher matcher = Patternpile("\\.").matcher("1234.$()($.");
//        while (matcher.find()){
//            System.out.println(matcher.group(0));
//        }// 不区分大小写的2中方法://    1、(?i)表示匹配时不区分大小写;//    2、Patternpile("abc", Pattern.CASE_INSENSITIVE)。// a(?i)bc 表示bc匹配时不区分大小写// a((?i)b)c 表示b匹配时不区分大小写
//        Matcher matcher = Patternpile("(?i)abc").matcher("abcd和ABCF");
//        while (matcher.find()){//abc、ABC都能匹配到
//            System.out.println(matcher.group(0));
//        }
//        Matcher matcher2 = Patternpile("abc", Pattern.CASE_INSENSITIVE).matcher("abcd和ABCF");
//        while (matcher2.find()){//abc、ABC都能匹配到
//            System.out.println(matcher2.group(0));
//        }//选择匹配符| 表示匹配其中任意一项
//        Matcher matcher = Patternpile("han|函|寒").matcher("hanshu函数寒冷");
//        while (matcher.find()) System.out.println(matcher.group(0));//限定符:// *表示匹配>=0次;+表示匹配>=1次;?表示匹配0或1次// [abcd]{3} 表示匹配由abcd中的字母组成的任意长度为3的字符串// [abcd]{3,} 表示匹配由abcd中的字母组成的任意长度>=3的字符串// [abcd]{3,5} 表示匹配由abcd中的字母组成的任意长度>=3且<=5的字符串// "a{3}" 表示匹配 aaa// "1{4}" 表示匹配 1111// "(\\d){2}" 表示匹配两位数// "a{3,4} 表示匹配 aaa or aaaa,其中有限匹配 aaaa(因为java默认贪婪匹配)// "a1?" 表示匹配 a1 or a
//        Matcher matcher = Patternpile("a1?").matcher("abcda1");
//        while (matcher.find()) System.out.println(matcher.group(0));// 将“?”紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m} 之后时,则默认为非贪心匹配。// "o+?"优先匹配单个 o,也就是只匹配 "o",而 "o+" 匹配的是所有的 "o".
//        Matcher matcher = Patternpile("\\d+?").matcher("11111111");
//        while (matcher.find()) System.out.println(matcher.group(0)); //每次只匹配到一个1//定位符// ^表示起始字符,$表示结束字符,\\b表示匹配目标字符串的边界(边界指子串间的空格),// \\B匹配目标字符串的非边界(与\\b刚好相反)// ^[0-9]+[a-z]* 表示匹配数字开头的字符串,数字数量>=1,后接任意个数(包括0)个小写字母// ^[0-9]\\-[a-z]+$ 表示匹配以一个数字开头,后接连字符“-”,并以至少一个小写字母结束的字符串
//        Matcher matcher = Patternpile("han\\b").matcher("wuhan hanleng"); //只能匹配到第一个han,因为其在边界上
//        while (matcher.find()) System.out.println(matcher.group(0));//".*(.{3,}).*\\1.*" 匹配长度 >=3 的重复子字符串// 这里的 .* 表示任意长度(>=0)的字符串,// 中间夹杂了 "(.{3,})" 和 "\\1",(.{3,})表示匹配任意长度>=3的字符串,\\1 表示匹配与前面(.{3,})一样的字符串// 所以 ".*(.{3,}).*\\1.*" 表示匹配长度 >=3 的重复子字符串Matcher matcher = Patternpile(".*(.{3,}).*\\1.*").matcher("abcdlalalaabchehehebcd");while (matcher.find()) System.out.println(matcher.group(0));  //有打印值:abcdlalalaabchehehebcdMatcher matcher2 = Patternpile(".*(.{3,}).*\\1.*").matcher("abcdlalala");while (matcher2.find()) System.out.println(matcher2.group(0));  //无打印值}
}

2、Java正则表达式参照表

.:匹配除了换行符(\n 或 \r)之外的任何字符。
*:匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。
+:匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。
?:匹配前面的子表达式零次或一次。例如,'do(es)?' 可以匹配 "do" 或 "does"。
{n}:n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "fo" 中的 'o',但能匹配 "ho" 中的两个 o。
{n,}:n 是一个非负整数。至少匹配 n 次。例如,'o{2,}' 不能匹配 "fo" 中的 'o',但能匹配 "ho" 中的两个 o,以及 "foob" 中的 'o'。
{n,m}:m 和 n 均为非负整数,其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如,'o{1,3}' 将匹配 "fooooood" 中的前三个 o。
\\:用来转义特殊字符,需要在反斜杠后面添加一个特殊字符,例如 \d 表示匹配数字。
^:匹配输入字符串的开始位置。
$:匹配输入字符串的结束位置。
[abc]:表示可以匹配任何一个括号内的字符,例如 [abc] 可以匹配 "a"、"b" 或 "c"。
[^abc]:表示不匹配任何一个括号内的字符。
\\d:匹配任何十进制数字,等同于 [0-9]。
\\D:匹配任何非数字字符,等同于 [^0-9]。
\\s:匹配任何空白字符,等同于 [ \t\n\r\f\v]。
\\S:匹配任何非空白字符。
\\w:匹配包括下划线的任何字母、数字或下划线字符,等同于 [A-Za-z0-9_]。
\\W:匹配任何非单词字符,等同于 [^A-Za-z0-9_]。
\b:匹配一个单词边界,也就是字与空白间的位置。
\B:匹配非单词边界的位置。
():将几个项组合为一个单元,这个单元可通过"*"、"+"、"?"和"{n}"这样的修饰符进行修饰,也可以记住与()相配的匹配结果(在下次匹配时使用)。
|:表示或,比如“abc|def”可以匹配"abc"或者"def"。
\n :在多数语境中代表一个换行符。
\t :制表符,或称 tab 键。
\r :回车符。
\f :换页符。
\v :垂直制表符。
\0 :空字符(null)。
\uXXXX :unicode 编码,可以用来表示一些特殊的字符。

更多推荐

Java正则表达式(全面回忆)

本文发布于:2023-11-15 17:55:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1603766.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:正则表达式   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!