regularexpression(正则表达式基本概念及理解)

发布时间:2025-12-10 19:19:16 浏览次数:11

正则表达式基本概念及理解-

正则表达式(Regular Expression)基本概念及理解正则表达式(RegularExpression)正则表达式(regularexpression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。正则表达式是由普通字符(例如字符a到z)以及特殊

正则表达式(Regular Expression)

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。

为什么需要正则表达式

文本的复杂处理

正则表达式的优势和用途

一种强大而灵活的文本处理工具

大部分编程语言、数据库、文本编辑器、开发环境都支持正则表达式

正则表达式定义

正如名字一样时描述了一个规则,通过这个规则可以匹配一类字符串

学习正则表达式很大程度上就是学习正则表达式的语法规则

开发中使用正则表达式的流程

分析所要匹配的数据,写出测试用的典型数据

在工具软件中进行匹配测试

在程序中调用通过测试的正则表达式

正则表达式语法

普通字符

字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是“普通字符”。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

简单的转义字符

\n :代表换行符 \t :制表符 \\ :代表\本身 \^,\$,\(,\),\{,\},\?,\+,\*,\|,\[,\] :匹配这些字符本身

标准字符集合

能够与‘多种字符’匹配的表达式

注意区分大小写,大写是相反的意思

\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(字母数字下划线)

匹配模式(针对RegexBuddy软件)

IGNORECASE 忽略大小写模式

匹配时忽略大小写,默认情况下,正则表达式是要区分大小写的

SINGLELINE 单行模式

整个文本看作一个字符串,只有一个开头,一个结尾,是小数点”.”可以匹配包含换行符(\n)在内的任意字符

MULTILINE 多行模式

每一行都是一个字符串,都有开头和结尾,在指定了MULTULINE之后,如果需要仅匹配字符串开始的和结束的位置,可以使用\A和\Z

选择符和分组

| :或,匹配左边或右边 () :捕获组,在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰,去匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到,每一对括号会分配一个编号,使用()的捕捉根据左括号的顺序重1开始自动编号。捕获元素编号为零的第一个捕获是由整个正则表达式模式匹配的文本 (?:Expression) :非捕获组,一些表达式中,不得不使用(),但又不需要保存()中子表达式匹配的内容,这是可以用非捕获组来抵消使用()带来的副作用。

反向引用(\nnn):每一对()会分配一个编号,使用()的捕捉根据左括号的顺序从1开始自动编号,通过反向引用,可以对分组已捕获的字符串进行引用。引用前面已捕获内容从第一个括号开始一组括号为一个(nnn表示个数)默认为\0

预搜索(零宽断言)对位置的匹配

(?=exp):断言自身出现的位置后面能匹配表达式exp (?<=exp):断言自身出现的位置的前面能匹配表达式exp (?!exp):断言此位置的后面不能匹配表达式exp (?<!exp):断言此位置的前面不能匹配表达式exp

断言后匹配的本身不计入匹配的字符串

例:电话号码验证:

邮箱验证:

常用正则表达式列表:

Java中使用正则表达式

将正则表达式变为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开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】: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());        }    }}
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477