发布时间:2025-12-10 19:19:16 浏览次数:11
正则表达式(Regular Expression)基本概念及理解正则表达式(RegularExpression)正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符a到z)以及特殊
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
文本的复杂处理
一种强大而灵活的文本处理工具
大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式
正如名字一样时描述了一个规则,通过这个规则可以匹配一类字符串
学习正则表达式很大程度上就是学习正则表达式的语法规则
分析所要匹配的数据,写出测试用的典型数据
在工具软件中进行匹配测试
在程序中调用通过测试的正则表达式
字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。
能够与‘多种字符’匹配的表达式
注意区分大小写,大写是相反的意思
\d :任意一个数字,0-9中的任意一个 \w :任意一个字母或数字或下划线,也就是A-Z,a-z,0-9,_,中任意一个 \s :包括空格、制表符、换行符等空白字符的其中任意一个 . :小数点可以匹配任意一个字符(除了换行符),如果要匹配包括“\n”在内的所有字符,一般用[\s\S]方括号匹配方式,能够匹配方括号中任意一个字符
[ab5@] :匹配”a”,“b”,“5″或”@” [^abc] :匹配非”a”,”b,”c”之外的任意一个字符 [f-k] :匹配”f”-“k”之间的任意一个字母 [^a-f0-3] :匹配”a”-“f”,“0”-“3″之外的任何一个字符正则表达式的特殊符号,被包含到中括号中,则失去了特殊意义,除了^,-之外
标准字符集合,除小数点外,如果被包含于中括号,自定义字符集合将包含该集合。如
[\d.\-+]将匹配:数字、小数点、-、+
修饰匹配次数的特殊符号,修饰的是前一个表达式
{n} :表达式重复n次 {m,n} :表达式至少重组m次,最多重复n次 {m,} :表达式至少重复m次 ? :匹配表达式0次或1次,相当于{0,1} + :表达式至少出现一次,相当于{1,} * :表达式出现或者出现多次,相当于{0,}匹配次数的贪婪模式:匹配的字符越多越好(默认)
匹配次数的非贪婪模式:匹配的字符越少越好,修饰匹配次数的特殊符号后再加上一个”?”
\d\d{6}其中只是对第二个的\d匹配6次,总共匹配7次
非贪婪:
匹配的是满足条件的位置,而不是字符
^ :字符串开头 $ :字符串结尾开始匹配 \b :匹配一个单词的边界,前面的字符和后面的字符不全是\w(字母数字下划线)IGNORECASE 忽略大小写模式
匹配时忽略大小写,默认情况下,正则表达式是要区分大小写的
SINGLELINE 单行模式
整个文本看作一个字符串,只有一个开头,一个结尾,是小数点”.”可以匹配包含换行符(\n)在内的任意字符
MULTILINE 多行模式
每一行都是一个字符串,都有开头和结尾,在指定了MULTULINE之后,如果需要仅匹配字符串开始的和结束的位置,可以使用\A和\Z
反向引用(\nnn):每一对()会分配一个编号,使用()的捕捉根据左括号的顺序从1开始自动编号,通过反向引用,可以对分组已捕获的字符串进行引用。引用前面已捕获内容从第一个括号开始一组括号为一个(nnn表示个数)默认为\0
断言后匹配的本身不计入匹配的字符串
例:电话号码验证:
邮箱验证:
常用正则表达式列表:
将正则表达式变为java对象
public class RegTest01 { public static void main(String[] args) { //在:asdasda123wwe12323中,是否符合指定的正则表达式\w+ //创建表达式对象 Pattern pattern = Pattern.compile("\\w+"); //创建Matcher对象:目标字符串 Matcher matcher = pattern.matcher("asdasda123wwe12323**asd"); System.out.println(matcher.matches()); boolean b = matcher.find();//该方法扫描输入的序列,查找与该模式匹配的下一个子序列 System.out.println(b); System.out.println(matcher.find()); System.out.println(matcher.find()); System.out.println(matcher.find()); }} 是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!
【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…
输出:
输出匹配得到的字符串:
while(matcher.find()) { System.out.println(matcher.group()); System.out.println(matcher.group(0));//group(),group(0)匹配整个表达式的子字符串 } 测试正则表达式的分组处理:
/* * 测试正则表达式的分组处理 * */public class RegTest02 { public static void main(String[] args) { Pattern pattern = Pattern.compile("([a-z]+)([0-9]+)"); Matcher matcher = pattern.matcher("asda123***asdada22*sda"); while (matcher.find()){ System.out.println(matcher.group());//匹配([a-z]+)([0-9]+) System.out.println(matcher.group(1));//即匹配([a-z]+) System.out.println(matcher.group(2));//匹配([0-9]+) } }} /* * 正则表达式在java中常用方法 * */public class RegTest03 { public static void main(String[] args) { Pattern pattern = Pattern.compile("[0-9]"); Matcher matcher = pattern.matcher("asda123***asdada22*sda"); //将数字替换 String s = matcher.replaceAll("&"); System.out.println(s); //使用正则表达式以数字进行分割 String s1 = "asda123***asdada22*sda"; String[] strings = s1.split("\\d+"); System.out.println(Arrays.toString(strings)); }} 输出:
/* * * 网络爬虫取链接 * */public class WebSpiderTest { public static String getUrlContent(String urlStr){ StringBuilder sb = new StringBuilder(); try { URL url = new URL(urlStr); BufferedReader bf = new BufferedReader(new InputStreamReader(url.openStream())); String temp = ""; while ((temp = bf.readLine()) != null){ sb.append(temp); } bf.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return sb.toString(); } public static void main(String[] args) { String regStr = getUrlContent("http://www.baidu.com"); Pattern pattern = Pattern.compile("<a[\\s\\S]+?</a>");//取得超链接整个内容 Pattern pattern1 = Pattern.compile("(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?");//取得超链接整个内容 Matcher matcher = pattern1.matcher(regStr); while (matcher.find()){ System.out.println(matcher.group()); } }}