彩妆网站建设报告,网页版传奇合击版本,郑州做网站的大公司,怎么用壳域名做网站正则表达式
1.1 正则表达式的概念及演示 在Java中#xff0c;我们经常需要验证一些字符串#xff0c;例如#xff1a;年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则#xff0c…正则表达式
1.1 正则表达式的概念及演示 在Java中我们经常需要验证一些字符串例如年龄必须是2位的数字、用户名必须是8位长度而且只能包含大小写字母、数字等。正则表达式就是用来验证各种字符串的规则。它内部描述了一些规则我们可以验证用户输入的字符串是否符合这些规则。
示例QQ号码验证
先看一个不使用正则表达式的例子验证QQ号码是否符合以下规则
QQ号码必须是5-15位长度。必须全部是数字。首位不能为0。
package com.rckivy.demo;public class RegexDemo1 {public static void main(String[] args) {String qq 1234567890;System.out.println(checkQQ(qq));// 使用正则表达式简化验证System.out.println(qq.matches([1-9]\\d{4,14}));}// 自定义验证QQ号的方法不使用正则表达式public static boolean checkQQ(String qq) {int len qq.length();if (len 5 || len 15) { return false;}if (qq.startsWith(0)) { return false;}for (int i 0; i len; i) {char c qq.charAt(i);if (c 0 || c 9) {return false;}}return true;}
}使用正则表达式简化验证
public class RegexDemo {public static void main(String[] args) {String qq 1234567890;System.out.println(qq.matches([1-9]\\d{4,14}));}
}这里的正则表达式 [1-9]\\d{4,14} 表示
[1-9]首位不能为0只能是1-9。\\d{4,14}接下来4到14位必须是数字总长度为5到15位。 1.2 正则表达式 - 字符类
正则表达式中可以使用字符类来定义匹配规则常见的字符类包括
[abc]表示a、b、c中任意一个字符。[^abc]表示除a、b、c以外的任意字符。[a-z]表示a到z的所有小写字母。[A-Z]表示A到Z的所有大写字母。[0-9]表示0到9的数字。[a-zA-Z0-9]表示a到z、A到Z和0到9的任意一个字符。[a-dm-p]表示a到d或m到p之间的任意字符。
代码示例
package com.rckivy.demo;public class RegexDemo2 {public static void main(String[] args) {// 使用字符类匹配System.out.println(a.matches([abc])); // trueSystem.out.println(z.matches([abc])); // falseSystem.out.println(x.matches([^abc])); // true// 匹配字母范围System.out.println(z.matches([a-zA-Z])); // trueSystem.out.println(A.matches([a-zA-Z])); // trueSystem.out.println(0.matches([a-zA-Z])); // false// 匹配多个字符System.out.println(z.matches([a-zA-Z][a-zA-Z])); // falseSystem.out.println(ab.matches([a-zA-Z][a-zA-Z])); // true}
}1.3 正则表达式 - 逻辑运算符
正则表达式中使用逻辑运算符可以灵活地构造匹配模式
并且表示组合多个条件。|或者表示在多个条件之间选择一个。\转义字符用于转义特殊字符。
代码示例
public class RegexDemo {public static void main(String[] args) {// 逻辑运算符匹配String regex [a-z[^aeiou]]ad; // 匹配以小写辅音字符开头后跟adSystem.out.println(bad.matches(regex)); // trueSystem.out.println(had.matches(regex)); // trueregex [a|e|i|o|u]ad; // 匹配以元音字符开头后跟adSystem.out.println(oad.matches(regex)); // trueSystem.out.println(had.matches(regex)); // false}
}1.4 正则表达式 - 预定义字符
预定义字符类简化了常见字符组的书写常见的预定义字符类包括
.匹配任意字符除了换行符。\d匹配任意数字字符0-9。\D匹配任意非数字字符。\s匹配空白字符空格、制表符等。\S匹配非空白字符。\w匹配单词字符字母、数字、下划线。\W匹配非单词字符。
代码示例
public class RegexDemo {public static void main(String[] args) {// 匹配单个字符System.out.println(a.matches(\\w)); // true, 匹配单词字符System.out.println(你.matches(\\w)); // false, 不是字母或数字System.out.println(3.matches(\\d)); // true, 匹配数字字符System.out.println( .matches(\\s)); // true, 匹配空格System.out.println($.matches(\\W)); // true, 匹配非单词字符}
}1.5 正则表达式 - 数量词
数量词用于指定字符或字符组的重复次数
X?0次或1次。X*0次到多次。X1次或多次。X{n}恰好n次。X{n,}至少n次。X{n,m}n到m次。
代码示例
public class RegexDemo {public static void main(String[] args) {// 数量词匹配System.out.println(1234.matches(\\d{4})); // true, 正好4位数字System.out.println(123.matches(\\d{2,4})); // true, 2到4位数字System.out.println(a.matches(\\w)); // true, 至少1个字母System.out.println(.matches(\\w*)); // true, 0个或更多字母}
}1.6 正则表达式练习
需求
请编写正则表达式验证用户输入的手机号码是否符合规则 手机号码必须是以1开头的11位数字。验证手机号码示例13112345678、13712345667。
代码示例
public class RegexDemo {public static void main(String[] args) {String regex 1[3-9]\\d{9}; // 匹配手机号码System.out.println(13112345678.matches(regex)); // trueSystem.out.println(13712345667.matches(regex)); // trueSystem.out.println(13945679027.matches(regex)); // trueSystem.out.println(139456790271.matches(regex)); // false}
}1.7 正则表达式练习2
需求 验证用户名是否满足要求 用户名由大小写字母、数字和下划线组成长度为4-16位。 验证身份证号码 简单要求18位前17位为数字最后一位可以是数字或大写/小写的x。复杂要求严格按照身份证号码的格式进行验证包括出生日期、地区代码等。
用户名验证
用户名的正则表达式规则
String regex1 \\w{4,16}; // \w 表示字母、数字或下划线{4,16} 表示长度为4到16位
System.out.println(zhangsan.matches(regex1)); // true
System.out.println(user1234.matches(regex1)); // true
System.out.println(u.matches(regex1)); // false
System.out.println($123.matches(regex1)); // false简单身份证号码验证
身份证号的规则
前17位为数字。最后一位可以是数字也可以是字母X不区分大小写。
String regex2 [1-9]\\d{16}[\\dXx]; // 前17位为数字最后一位为数字或X
System.out.println(41080119930228457x.matches(regex2)); // true
System.out.println(510801197609022309.matches(regex2)); // true
System.out.println(15040119810705387X.matches(regex2)); // true
System.out.println(12345678901234567X.matches(regex2)); // false (开头不能为0)复杂身份证号码验证
在更复杂的身份证号码规则中需要验证更多细节包括
前6位表示地区代码不能以0开头。第7到14位表示出生日期年份为18、19或20开头月份为01到12日期为01到31。最后一位同样可以是数字或字母X。
String regex3 [1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx];
System.out.println(41080119930228457x.matches(regex3)); // true
System.out.println(510801197609022309.matches(regex3)); // true
System.out.println(15040119810705387X.matches(regex3)); // true
System.out.println(130133197204039024.matches(regex3)); // true1.8 本地数据爬取
Pattern 和 Matcher
在Java中Pattern类用来表示正则表达式Matcher类则是正则表达式应用到某个文本后的匹配结果对象。我们可以使用它们从大文本中提取出符合正则表达式的子串。
示例从文本中爬取特定模式的数据
需求
有如下文本请从中爬取所有 JavaXX 的内容XX代表任意数字。
public class RegexDemo6 {public static void main(String[] args) {String str Java自从95年问世以来经历了很多版本 目前企业中用的最多的是Java8和Java11 下一个长期支持版本是Java17相信在未来不久Java17也会逐渐登上历史舞台;// 1. 创建正则表达式的Pattern对象Pattern p Pattern.compile(Java\\d{0,2});// 2. 获取Matcher对象Matcher m p.matcher(str);// 3. 循环查找匹配的内容while (m.find()) {System.out.println(m.group());}}
}在上面的示例中Java\\d{0,2} 匹配以 “Java” 开头后面跟0到2个数字的字符串。m.find() 方法每次查找下一个符合条件的字符串直到查找完毕。 1.9 网络数据爬取
有时候我们不仅需要从本地数据中提取信息还需要从网络上的网页中提取数据。这种场景下可以通过Java中的 URL 和 URLConnection 来获取网页内容然后使用正则表达式提取所需的数据。
示例从网页中爬取身份证号码
需求
从指定的网页中提取所有的身份证号码。
import java.io.*;
import java.net.*;
import java.util.regex.*;public class RegexDemo7 {public static void main(String[] args) throws IOException {// 创建URL对象连接到网页URL url new URL(https://example.com/sample_page.html);URLConnection conn url.openConnection();// 使用BufferedReader读取网页内容BufferedReader br new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;// 创建匹配身份证号的正则表达式String regex [1-9]\\d{16}[\\dXx];Pattern pattern Pattern.compile(regex);// 逐行读取网页内容查找匹配项while ((line br.readLine()) ! null) {Matcher matcher pattern.matcher(line);while (matcher.find()) {System.out.println(matcher.group());}}br.close();}
}这个程序会从网页中逐行读取内容并使用正则表达式 [1-9]\\d{16}[\\dXx] 匹配身份证号码。 1.10 正则表达式爬取数据练习
需求
从给定的文本中提取出所有的座机号码、邮箱、手机号和热线电话。
文本内容
来学校学习Java手机号:1851251675818512508907或者联系邮箱:boniuitbright.cn
座机电话:010-36517895010-98951256邮箱:bozaiitbright.cn
热线电话:400-618-90904006189090代码实现
public class RegexDemo8 {public static void main(String[] args) {String s 来学校学习Java手机号:1851251675818512508907 或者联系邮箱:boniuitbright.cn座机电话:010-36517895010-98951256 邮箱:bozaiitbright.cn热线电话:400-618-90904006189090;// 正则表达式String regex (1[3-9]\\d{9}) // 手机号|(\\w[\\w[^_]]{2,6}(\\.[a-zA-Z]{2,3}){1,2}) // 邮箱|(0\\d{2,3}-?[1-9]\\d{4,9}) // 座机|(400-?\\d{3}-?\\d{4}); // 热线电话Pattern p Pattern.compile(regex);Matcher m p.matcher(s);// 逐一查找并输出结果while (m.find()) {System.out.println(m.group());}}
}1.11 按需求爬取特定数据
需求
给定一段文本爬取出所有符合条件的Java版本信息。
文本内容
Java自从95年问世以来经历了很多版本目前企业中用的最多的是Java8和Java11
因为这两个是长期支持版本下一个长期支持版本是Java17相信在未来不久Java17也会逐渐登上历史舞台。需求1爬取版本号为 8、11 和 17 的 Java 文本但只显示 “Java”不显示版本号。
String regex1 ((?i)Java)(?8|11|17); // 使用正向肯定预查需求2爬取版本号为 8、11 和 17 的 Java 文本显示完整的 “Java8”、“Java11” 和 “Java17”。
String regex2 ((?i)Java)(8|11|17); // 匹配 Java 后面的版本号需求3爬取除版本号为 8、11、17 以外的 Java 文本。
String regex3 ((?i)Java)(?!8|11|17); // 使用负向预查排除指定的版本号示例代码
public class RegexDemo9 {public static void main(String[] args) { String s Java自从95年问世以来经历了很多版本目前企业中用的最多的是Java8和Java11 下一个长期支持版本是Java17相信在未来不久Java17也会逐渐登上历史舞台;// 示例1只匹配Java不显示版本号String regex1 ((?i)Java)(?8|11|17);Pattern p1 Pattern.compile(regex1);Matcher m1 p1.matcher(s);while (m1.find()) {System.out.println(m1.group());}// 示例2显示Java和版本号String regex2 ((?i)Java)(8|11|17);Pattern p2 Pattern.compile(regex2);Matcher m2 p2.matcher(s);while (m2.find()) {System.out.println(m2.group());}}
}1.12 贪婪匹配和非贪婪匹配
贪婪匹配
在正则表达式中默认情况下是贪婪匹配即在满足匹配规则的情况下它会尽可能多地匹配字符。
非贪婪匹配
如果你希望正则表达式尽量少匹配字符可以使用非贪婪匹配即在限定范围内尽量少地匹配字符。
贪婪匹配和非贪婪匹配的区别在于
贪婪匹配*、 等默认是贪婪的会尽量多匹配。非贪婪匹配在 *、 等后面加 ?则变为非贪婪匹配。
示例代码
public class RegexDemo10 {public static void main(String[] args) {// 贪婪匹配尽可能多地匹配String s1 abbbbbbbbbbbbaaaaaaaa;String regex1 ab;Pattern p1 Pattern.compile(regex1);Matcher m1 p1.matcher(s1);while (m1.find()) {System.out.println(贪婪匹配 m1.group());}// 非贪婪匹配尽可能少地匹配String regex2 ab?;Pattern p2 Pattern.compile(regex2);Matcher m2 p2.matcher(s1);while (m2.find()) {System.out.println(非贪婪匹配 m2.group());}}
}输出结果
贪婪匹配abbbbbbbbbbbb
非贪婪匹配ab1.13 使用正则表达式切割字符串
String的split方法
Java的 String 类提供了一个 split(String regex) 方法允许根据正则表达式来拆分字符串。通过 split可以将匹配正则表达式的部分作为分隔符从而把字符串切割成多个子串。
示例代码
public class RegexSplitDemo {public static void main(String[] args) {// 示例字符串String s 小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠;// 使用正则表达式切割字符串将所有非中文部分作为分隔符String[] arr s.split([\\w[^_]]);// 遍历并打印结果for (String str : arr) {System.out.println(str);}}
}输出结果
小诗诗
小丹丹
小惠惠1.14 使用正则表达式替换内容
String的replaceAll方法
Java中的 replaceAll(String regex, String replacement) 方法可以使用正则表达式找到需要替换的内容并将其替换为指定的字符串。这个方法会用 replacement 替换所有符合 regex 的匹配项。
示例代码
public class RegexReplaceDemo {public static void main(String[] args) {// 示例字符串String s 小诗诗dqwefqwfqwfwq12312小丹丹dqwefqwfqwfwq12312小惠惠;// 使用正则表达式将所有非中文部分替换为vsString result s.replaceAll([\\w[^_]], vs);// 打印替换后的字符串System.out.println(result);}
}输出结果
小诗诗vs小丹丹vs小惠惠1.15 正则表达式-分组括号 ( )
分组括号 () 在正则表达式中用于将部分表达式分组以便后续引用或者进行逻辑处理。常见应用包括
捕获通过分组匹配特定内容并通过组号进行提取。反向引用使用 \1, \2 等引用之前的分组。非捕获分组使用 (?:...) 来仅进行分组而不进行捕获。
示例 1反向引用
需求判断一个字符串的开始和结束字符是否一致只考虑单个字符。
public class RegexDemo {public static void main(String[] args) {// 匹配字符串的开始和结束字符是否一致String regex (.).\\1; // 捕获第一个字符并在最后匹配同样的字符System.out.println(a123a.matches(regex)); // trueSystem.out.println(b456b.matches(regex)); // trueSystem.out.println(abcba.matches(regex)); // trueSystem.out.println(abcd.matches(regex)); // false}
}示例 2多字符反向引用
需求判断字符串的开始和结束部分是否一致并且允许多个字符。
public class RegexDemo {public static void main(String[] args) {// 匹配字符串的开始部分和结束部分是否一致支持多字符String regex (.).\\1; // 捕获开始部分并在最后匹配相同的内容System.out.println(abc123abc.matches(regex)); // trueSystem.out.println(def456def.matches(regex)); // trueSystem.out.println(xyz789abc.matches(regex)); // false}
}示例 3非捕获分组
有时我们只需要分组但不需要捕获内容这时可以使用非捕获分组 (?:...)。这在提高效率和避免组号混淆时很有用。
public class RegexDemo {public static void main(String[] args) {// 使用非捕获分组只分组不捕获String regex (?:abc); // 匹配 abc 一次或多次不捕获System.out.println(abcabc.matches(regex)); // trueSystem.out.println(abc.matches(regex)); // trueSystem.out.println(abcd.matches(regex)); // false}
}1.16 忽略大小写匹配
在正则表达式中我们可以使用 (?i) 来忽略大小写匹配。例如(?i)abc 将匹配 abc、ABC、Abc 等大小写混合的情况。
在正则表达式中可以使用 (?i) 来忽略大小写的匹配。
示例
public class RegexDemo {public static void main(String[] args) {// 忽略大小写匹配 abcString regex (?i)abc; // 忽略大小写匹配 abcSystem.out.println(abc.matches(regex)); // trueSystem.out.println(ABC.matches(regex)); // trueSystem.out.println(AbC.matches(regex)); // true}
}局部忽略大小写
public class RegexDemo {public static void main(String[] args) {// 匹配 abc只忽略中间的 b 大小写String regex a(?i)bC; System.out.println(aBc.matches(regex)); // trueSystem.out.println(abc.matches(regex)); // false}
}1.17 非捕获分组
有时候我们希望将正则表达式的一部分进行分组但不希望在匹配结果中引用这个分组。我们可以使用非捕获分组 (?:)这种分组不会占用分组编号。
示例身份证号验证
需求验证18位身份证号码前17位必须为数字最后一位可以是数字或大小写的 “X”。
public class RegexDemo {public static void main(String[] args) {// 非捕获分组仅用于分组不捕获String regex [1-9]\\d{16}(?:\\d|X|x);System.out.println(41080119930228457X.matches(regex)); // trueSystem.out.println(510801197609022309.matches(regex)); // trueSystem.out.println(15040119810705387x.matches(regex)); // true}
}gex)); // true System.out.println(“abc”.matches(regex)); // false } } ---## 1.17 非捕获分组有时候我们希望将正则表达式的一部分进行分组但不希望在匹配结果中引用这个分组。我们可以使用非捕获分组 (?:)这种分组不会占用分组编号。### 示例身份证号验证需求验证18位身份证号码前17位必须为数字最后一位可以是数字或大小写的 X。java
public class RegexDemo {public static void main(String[] args) {// 非捕获分组仅用于分组不捕获String regex [1-9]\\d{16}(?:\\d|X|x);System.out.println(41080119930228457X.matches(regex)); // trueSystem.out.println(510801197609022309.matches(regex)); // trueSystem.out.println(15040119810705387x.matches(regex)); // true}
}