精华内容
下载资源
问答
  • 由于正则表达式定了一些特殊字符,而有时候需要对这些特殊字符进行匹配的话就需要进行转义了,下面这篇文章主要给大家介绍了Java正则表达式处理特殊字符转义的方法,需要的朋友可以参考借鉴,下面来一起看看吧。
  • 际域名格式如下: 域名由各国文字的特定字符集、英文字母、数字及“-”(即连字符或... /内容/i 构成一个不区分大小写的正则表达式; ^ 匹配开始 $ 匹配结束 [a-z] E-Mail前缀必需是一个英文字母开头 ([a-z0-9]*[-_]?[a-z
  • 一个完整的域名,由根域、顶级域、二级、三级……域名构成,每级域名之间用点分开,每级域名由字母、数字和减号构成(第一个字母不...匹配完整域名的正则表达式: 代码如下: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-
  • 用户名:(4-16位,字母、下划线、数字,减号) <input type="text" id="un" placeholder="4-16位" > <input type="button" value="test" onclick="userName()" > <span i
  • JAVA正则表达式

    2021-01-27 01:51:03
    如:^tm :该表达式表示要匹配字串tm的开始位置是行头,如tmequalTomorrowMoon就可以匹配tm$ :该表达式表示要匹配字串tm的位置是行尾,Tomorrow Moon equal tm匹配。如果要匹配的字串可以出现在字符串的任意部分,...

    一、行定位符(^和$)

    行定位符就是用来描述字串的边界。“^”表示行的开始;“$”表示行的结尾。如:

    ^tm : 该表达式表示要匹配字串tm的开始位置是行头,如tm equal Tomorrow Moon就可以匹配

    tm$ : 该表达式表示要匹配字串tm的位置是行尾,Tomorrow Moon equal tm匹配。

    如果要匹配的字串可以出现在字符串的任意部分,那么可以直接   写成 :tm

    二、单词定界符(\b、\B)

    单词分界符\b,表示要查找的字串为一个完整的单词。如:\btm\b

    还有一个大写的\B,意思和\b相反。它匹配的字串不能是一个完整的单词,而是其他单词或字串的一部分。如:\Btm\B

    三、字符类([ ])

    正则表达式是区分大小写的,如果要忽略大小写可使用方括号表达式“[]”。只要匹配的字符出现在方括号内,即可表示匹配成功。但要注意:一个方括号只能匹配一个字符。例如,要匹配的字串tm不区分大小写,那么该表达式应该写作如下格式:[Tt][Mm]

    POSIX风格的预定义字符类如表所示:

    60fe9a08d918f6c5afcecbb640f00157.png

    四、选择字符(|)

    还有一种方法可以实现上面的匹配模式,就是使用选择字符(|)。该字符可以理解为“或”,如上例也可以写成 (T|t)(M|m),该表达式的意思是以字母T或t开头,后面接一个字母M或m。

    使用“[]”和使用“|”的区别在于“[]”只能匹配单个字符,而“|”可以匹配任意长度的字串。如果不怕麻烦,上例还可以写为 :TM|tm|Tm|tM

    五、连字符(-)

    变量的命名规则是只能以字母和下划线开头。但这样一来,如果要使用正则表达式来匹配变量名的第一个字母,要写为 :[a,b,c,d…A,B,C,D…]

    这无疑是非常麻烦的,正则表达式提供了连字符“-”来解决这个问题。连字符可以表示字符的范围。如上例可以写成 :[a-zA-Z]

    六、排除字符([^])

    上面的例子是匹配符合命名规则的变量。现在反过来,匹配不符合命名规则的变量,正则表达式提供了“^”字符。这个元字符在前面出现过,表示行的开始。而这里将会放到方括号中,表示排除的意思。

    例如:[^a-zA-Z],该表达式匹配的就是不以字母和下划线开头的变量名。

    七、限定符(? * + {n,m})

    对于重复出现字母或字串,可以使用限定符来实现匹配。限定符主要有6种,如表所示:

    bd6de9a2b9a71f8e22aecda845af48ed.png

    八、点号字符(.)

    点字符(.)可以匹配出换行符外的任意一个字符。

    注意:是除了换行符外的、任意的一个字符。如匹配以s开头、t结尾、中间包含一个字母的单词。

    格式如下: ^s.t$,匹配的单词包括:sat、set、sit等。

    再举一个实例,匹配一个单词,它的第一个字母为r,第3个字母为s,最后一个字母为t。能匹配该单词的正则表达式为:^r.s.*t$

    九、转义字符(\)

    正则表达式中的转移字符(\)和PHP中的大同小异,都是将特殊字符(如“.”、“?”、“\”等)变为普通的字符。举一个IP地址的实例,用正则表达式匹配诸如127.0.0.1这样格式的IP地址。如果直接使用点字符,格式为:[0-9]{1,3}(.[0-9]{1,3}){3}

    这显然不对,因为“.”可以匹配一个任意字符。这时,不仅是127.0.0.1这样的IP,连127101011这样的字串也会被匹配出来。所以在使用“.”时,需要使用转义字符(\)。修改后上面的正则表达式格式为: [0-9]{1,3}(\.[0-9]{1,3}){3}

    十、反斜线(\)

    除了可以做转义字符外,反斜线还有其他一些功能。反斜线可以将一些不可打印的字符显示出来,如表所示:

    fe3c381dea1f5c887cb450ab615dc642.png

    还可以指定预定义字符集,如表所示:

    f85982338636c95d3d97fee1947abb60.png

    反斜线还有一种功能,就是定义断言,其中已经了解过了\b、\B,其他如表所示:

    0a5a4f6a76c3926a0759c966d08424cb.png

    十一、括号字符(())

    小括号字符的第一个作用就是可以改变限定符的作用范围,如“|”、“*”、“^”等。来看下面的一个表达式。

    (thir|four)th,这个表达式的意思是匹配单词thirth或fourth,如果不使用小括号,那么就变成了匹配单词thir和fourth了。

    小括号的第二个作用是分组,也就是子表达式。如(\.[0-9]{1,3}){3},就是对分组(\.[0-9]{1,3})进行重复操作。后面要学到的反向引用和分组有着直接的关系。

    十二、反向引用

    十三、模式修饰符

    模式修饰符的作用是设定模式。也就是规定正则表达式应该如何解释和应用。

    不同的语言都有自己的模式设置,PHP中的主要模式如表所示:

    42e33e1460a2c66e69462addc15ac4d1.png

    展开全文
  • 正则表达式用来干嘛正则表达式是用来匹配文本的一种语言。别被语言吓到,正则表达式其实非常简单,可能你花2个小时就能用起来,但是你一定会觉得非常强大,像非常厉害的数据爬取,网页爬虫,都要用到正则表达式!...

    正则表达式用来干嘛

    • 正则表达式是用来匹配文本的一种语言。别被语言吓到,正则表达式其实非常简单,可能你花2个小时就能用起来,但是你一定会觉得非常强大,像非常厉害的数据爬取,网页爬虫,都要用到正则表达式!

    什么是正则表达式

    维基百科解释:

    正则表达式(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),又称正规表示式、正规表示法、正规运算式、规则运算式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在 Perl 中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由 Unix 中的工具软件(例如 sed 和 grep)普及开的。

    833414d8146b604c69171aaef7e967e0.png
    表格1

    单位划分

    • 正则表达式由操作符和原子构成(操作元),也就是操作符,和操作的对象!先上个例子1:
    import 

    操作原子

    本意原子

    • 例1中[A-Z]的意思是匹配大写字母,且只匹配一个大写字母!如例2:
    import 
    • 而[a-z]只匹配一个小写字母。如例3:
    import 
    • +加号表示匹配1个或者多个前面的操作元,默认情况是匹配尽可能多的字符,什么意思呢?如例4
    import 
    • 例4中结果匹配了两个WW,但是加一个问号?就表示尽可能少的匹配,也就是非贪婪模式。如例5:
    import 
    • *星号的意思是匹配0个或者多个,同样有贪婪模式和非贪婪模式。例子1中*星号后面有个问号?表示非贪婪模式,匹配数字0个数字,一般情况下就是不匹配数字的意思
    • 注意正则匹配是拿整个表达式去匹配文本,得到的加入到列表中,然后从匹配到的字符下一个字符开始重新匹配,如此循环直到结束!
    • 例1中A-Z,a-z,0-9是正则表达式的本意原子,表示的就是本身,没有其他意思
    • 而加号+星号*?减号-等并不是表示表面上的的意思,如+加号并不是字符串拼接或者两个数字相加,同样的-减号并不是两个数字相减,[0-9]表示的是匹配0-9中的任意一个整数.
    • 例1中的*号是数量操作符,表示匹配0个或者多个前面一个原子,类似的操作符还有+,?,*, {n, m}对照表格1.
    展开全文
  • 正则表达式描述的是一种规则,符合...本篇文章主要从Java这门程序设计语言的角度理解正则表达式的应用,主要涉及以下内容:基本正则表达式的理论基础Java中用于正则表达式匹配的类几种常用的正则表达式使用实例一...

    正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的。在正则表达式中,主要有两种字符,一种描述的是普通的字符,另一种描述的是元字符。其中元字符是整个正则表达式的核心,并由它完成规则的制定工作。本篇文章主要从Java这门程序设计语言的角度理解正则表达式的应用,主要涉及以下内容:

    基本正则表达式的理论基础

    Java中用于正则表达式匹配的类

    几种常用的正则表达式使用实例

    一、正则表达式的理论基础

    1、普通字符的表示

    我们说正则表达式主要由普通字符和元字符组成,那么我们首先先看看普通字符该如何表示。大部分普通字符由字符本身即可表示,例如:'s','i','n','g','l','e'等。除此之外,也有一些特殊的表示方式。

    以/0开头,后面紧跟1-3位数字,表示的是一个八进制数。这个数的十进制值对应于ASCII编码中的相应字符。

    以/x或者/X开头,后面紧跟两位字符,表示的是一个十六进制的数。该数的十进制的值对应于ASCII编码中相应的字符。

    以/u开头,后面紧跟四位字符,表示一个Unicode编号。该编号对应于Unicode字符集中的一个具体字符。

    另外还有一些元字符,虽然它们具有特殊的含义,但是往往在某种特殊情况下,需要将这些元字符当做普通字符使用,我们使用 '/'+元字符,表示转移该元字符,此后该元字符将表示一个普通字符。例如:'//','/^',它们分别表示的是 '/'和 '^',不再具有特殊含义了。下面我们开始逐渐介绍正则表达式语法中的元字符的特殊含义。

    2、字符组匹配单个字符

    我们用一对中括号([.....])表示字符组,整个字符组中会有多个字符位列其中,该字符组表示的含义是:匹配任意一个字符,该字符是位列字符组中的。例如:[single]匹配的是字符's','i','n','g','l','e'中的任意一个字符。以上我们简单介绍了字符组的基本概念以及它所能匹配的内容,其实有时候为了表述连续的字符,我们会结合元字符 '-' 一起来操作字符组。例如:[0123456789],匹配的是0到9之间的任意一个数字,对于这种情况我们可以选择这样来简化操作:[0-9]。其实两者表述的含义是一样的,为了简化起见,如果遇到连续的字符表述,可以选择使用元字符来简化。同样的还有[a-z],它匹配任意一个小写字母。对于元字符 '-' 还需要说明一点的是:该字符只有出现在两个字符之间才具有特殊含义,单独出现在字符组的所有字符之前或者之后只能表述普通字符 '-' 。下面介绍有关字符组的一些其他相关的元字符。

    元字符 '^' 表示排除的意思,和元字符 '-' 类似,只有放在所有字符的最前面才具有特殊含义,否则只能表示普通字符。例如:[1234],该字符组匹配一个字符,但是不是1或2或3或4。当然,[cyy],匹配的是四个普通字符,'c','^','y','y'。此外,需要注意一点的是,除了以上介绍的几种元字符必须置放于指定位置上才能起作用以外,其余所有元字符在字符组中统统被视作普通字符,不再具有特殊含义。

    除此之外,字符组还支持嵌套使用。例如:[0-9[a-z]],该字符组匹配一个数字或者一个字母。我们也可以使用&&加强限定规则。例如:[0-9&&[^0123]],该字符组匹配的是0到9之间任意一个数字,但是该数字不能是0到3中任意一个,也就是只能匹配4到9之间任意一个数字。最后和字符组有关的内容还是涉及一个预定义字符组,所谓预定义字符组就是对字符组的适当封装,对于一些简单的组合使用简介的调用方式。例如:

    \d:等同于字符组 [0-9],表示任意一个数字字符

    \w:较为常见,等同于字符组[0-9a-zA-Z],表示任意一个world(单词字符)

    \s:等同于[ \t\n\x0B\f\r],匹配的是一个空格字符(space)

    当然,它们也有相对应的大写形式,但是表示的意思却是截然相反的。

    \D:等同于[^0-9],表示一个任意非数字字符

    \W:等同于[^0-9a-zA-Z],表示任意一个非单词字符,往往会是一些特殊符号

    \S:等同于[^\t\n\x0B\f\r],匹配一个任意非空格的字符

    3、用于指定字符多次出现的量词

    所谓的量词主要是三个元字符,它们主要用于指定量词前面的字符在匹配时可以多次出现,具体区别接下来会介绍。首先我们需要知道,这三个元字符是:+ ,*, ?。下面描述它们各自作用及相互之间的区别:

    +:该元字符指定位于元字符前面的普通字符可以出现一次或者多次。例如:se+cyy这个正则表达式,字符secyy,seeeecyy都是可以匹配的,但是scyy是不能匹配的,前面的字符是必须出现的。

    *:该元字符指定位于元字符前面的普通字符可以出现零次或多次。例如:

    se*cyy

    对于该正则表达式而言,secyy,seecyy都是可匹配的,并且scyy也是可以匹配的。这就是和元字符 + 的简单区别。

    ?:该元字符指定位于元字符前面的普通字符可以出现也可以不出现,但是不能多次出现。例如:se?cyy,对于该正则表达式,secyy,scyy等都是可匹配的,但是seeeecyy则是不能匹配的。它指定你前面的一个字符要么出现,要么不出现,不允许多次出现。

    在这里我们要申明一个误区,这里的三个元字符量词作用的是紧邻该元字符前面的一个字符,并不是作用与元字符前面所有的字符,这里是需要注意的,包括笔者当初也都是误以为此的。

    以上我们介绍了简单量词的概念,但是它们只能用于表示模糊的次数。可以出现多次,但是多次是多少却没有定论。对于要求字符出现精确次数的情况,我们可以使用通用量词来解决。{m,n}是通用量词的最基本形式,它指定前面的字符出现的次数在m到n之间。看几个例子:

    se{0,10}cyy:其中e可以出现0-10次

    se{9}cyy:其中e必须出现9次

    se{0,}cyy:其中e可以出现0-无穷大次,等同于se*cyy。

    4、分组划分组别

    在介绍分组之前,无论是使用量词还是字符组都是针对的一个字符。而分组针对的就是一串字符,我们也可以对分组使用量词,控制该分组出现的次数。我们使用()括号表示分组,例如:

    sing(le)de(cyy)

    其中le和cyy分别是一个分组,对于一个完整的正则表达式,从头开始,每个分组都是有编号的,按照出现的次序,以1为基数递增。至于为什么要有编号,下文说。对于分组我们依然是可以使用量词控制其出现次数的,例如:

    sing(le)+cccc:在该正则表达式中,分组le可以出现一次或者多次

    sing(le)*cccc:在该正则表达式中,分组le可以出现零次或者多次

    结合元字符 '| ',可以实现和字符组一样的功效,例如:

    (happy|cyy|single)

    该正则表达式可以匹配三个字符子串,happy,cyy,single。但是这里需要注意的是,元字符 | 如果用于字符组中就不再具有特殊含义,将会被作为普通字符来匹配。(这一点其实在介绍字符组的时候已经强调过)

    下面解决一个上文遗留问题,分组的编号到底有什么作用。为分组编号其实是为了重新捕获和使用分组,每个分组按照出现的次序从1开始递增,我们使用 +分组编号进行引用。例如:

    (.*)\1>:该正则表达式等效于:(.*)\w+>

    (\w+)表示任意个字符(字母或数字),(.*)表示任意的符号,\1则引用了分组(\w+)。所以在这里,html中所有非单标签元素都是能匹配的。当然,如果我们不想使用默认的编号来引用分组,我们其实也是可以在定义分组的时候为分组命名。为分组命名的语法格式为:(?X),引用分组的语法格式为:\k。例如:

    a)>(.*)\k>:等效于:(.*)

    上述正则表达式定义了一个名为num1的分组,并后续进行了引用。下面介绍正则表达式的最后一块理论基础,边界匹配。

    5、边界匹配

    以上我们所介绍的所有内容主要还是针对单个字符或者多个字符组成的分组,我们可以限制他们的出现次数以及出现位置等。但是其实在正则表达式中,我们也是可以限制边界必须满足某种条件的。主要涉及的元字符有:^, $, \A, \Z, \z和\b。

    首先看元字符 ^ ,在字符组中,该元字符表示否定的意思,此处匹配正则表达式首部位置边界。例如:^abc匹配一个以abc开头的字符串。

    元字符 $匹配的字符串的尾部边界,它规定被匹配的字符串必须以什么结束。例如:

    abc$:dabc,abc,abc/n都是可匹配的

    实际上,如果被匹配字符串是以指定字符结尾或者指定字符之后跟换行符,都是可匹配的。此处需要注意尾部边界匹配时的表述格式。(不同于首部匹配)

    \b匹配的是单词边界,所谓的单词边界指的就是:当一边是字符,一边是非字符的时候,此处即为单词边界。也就是单词结束的那个位置。还有一些边界,例如:\A,\b,\Z等,各自匹配的边界如下图所示;

    当然,对于边界匹配最通用的一种方式就是环视。它不局限于整个表达式的开头和结尾,它可以出现在表达式中的任何位置,既可以向前匹配,也可以向后匹配。主要分为以下四种情况:

    肯定顺序环视:它要求表达式的右边字符串必须满足某种约定,语法(?=....)。例如:single(?=cyy),字符e的右边即为边界并且要求必须为cyy,所以该表达式只能匹配singlecyy。

    否定顺序环视:它要求表达式的右边字符串必须不能满足某种约定,和上一中情况是相反的,语法格式为:(?!...)。

    肯定逆序环视:它要求表达式的左边必须满足某种约束,语法格式为:(?<=...)。

    否定逆序环视:它要求表达式的左边必须不能满足某种约束,语法格式为:(?

    虽然看起来有四种不同的环视类型,但是实际上分为两种,一种是向左看,一种是向右看。以上有关正则表达式的基本内容大致介绍完结,下面主要看看如何在Java中验证我们上述的这些理论。

    二、Java API对正则表达式的支持

    在Java中,对正则表达式的支持,主要还是java.util.regex这个包,我们常用的是其中的Pattern和Matcher这两个类。其中Pattern绑定了一个正则表达式,也就是代表了一个规则,Matcher绑定了一个Pattern和一个被处理的字符串,我们可以利用Matcher中的一些方法来完成匹配工作。此外,Java中所有的正则表达式都是以字符串的形式出现的,所以自然离不开String这个类,该类中的很多方法的参数都是基于正则表达式的,下文将详细介绍。我们首先看Pattern这个类。

    Pattern主要用于编译一个正则表达式,也就是创建一个Pattern对象,该对象与实际的一个正则表达式想绑定,它仅仅代表一个规则,与实际要匹配的字符串无关。例如:

    String str = "//w";

    Pattern p = Pattern.compile(str);

    Pattern的compile方法将str这个正则表达式编译成一种内部结构,然后以Pattern实例的形式返回,至于这种内部结构是什么样子的,此处暂时不涉及。我们只需要知道,此时返回的pattern实例是绑定了一个正则表达式的。当然,Pattern还有一个compile重载,可显式指定匹配模式。

    public static Pattern compile(String regex, int flags) {

    return new Pattern(regex, flags);

    }

    此处主要有四种匹配模式可选,单行模式,多行模式,无视大小写模式,无视元字符模式(该模式下,所有元字符将会失效)。各自对应的常量:Pattern.DOTALL,Pattern.MULTILINE,Pattern.CASE_INSENSITIVE,Pattern.LITERAL。这些常量的值如下:

    public static final int DOTALL = 0x20;(32)

    public static final int MULTILINE = 0x08;(8)

    public static final int CASE_INSENSITIVE = 0x02;(2)

    public static final int LITERAL = 0x10;(16)

    当然,我们没必要记住他们各自所对应的常量的值,在使用的时候直接调用它们的常量名即可。下面通过介绍String的几个基本方法,了解正则表达式在Java中的基本使用情况。

    首先我们看split方法,该方法用于分割字符串,返回一个String数组。

    public String[] split(String regex, int limit)

    第一个参数接受的是一个正则表达式,第二参数用于限定分割次数。其实从其源代码中我们大致可以知晓该方法作用原理:首先利用indexOf方法找到分割符首次出现的位置,将该位置以前所有字符保存,拿到剩余子串的所有内容,一样的操作。最后得到的数组就是按照分隔符分割的结果。limit只不过强制限定了分割次数,达到次数上限,即使后面仍有分隔符可匹配,也选择放弃。(打包后面所有内容为一个分组),看个例子:

    public static void main(String [] args){

    String str = "cyy,single.abc/https";

    String[] results = str.split("[,./]");

    for(String s : results){

    System.out.print(s+" ");

    }

    }

    输出结果:cyy single abc https

    此处有人可能会有疑问,说好的Pattern和Matcher才是正则表达式的主要操作类,怎么没见到他们。其实在split内部调用的就是Pattern的相关方法。

    return Pattern.compile(regex).split(this, limit);

    这是String类中split方法的最后一行代码,String中的split方法除了最后一行代码,其余代码处理的都是regex为普通单个字符的情况,而对于多个字符乃至包含元字符的时候都是由Pattern中split方法处理的,该方法中会创建Matcher类并调用其中find等方法进行匹配查找,代码量比较多,此处不再赘述。

    下面看String的一个匹配校验的方法。

    public boolean matches(String regex) {

    return Pattern.matches(regex, this);

    }

    显然,该方法内部调用的是Pattern的matches方法,

    public static boolean matches(String regex, CharSequence input) {

    Pattern p = Pattern.compile(regex);

    Matcher m = p.matcher(input);

    return m.matches();

    }

    这是一个非常标准的对正则表达式的处理流程,首先编译(绑定)正则表达式字符串获取Pattern实例,然后调用Pattern的matcher方法获取Matcher实例,接着就可以利用Matcher实例完成大量工作。此处调用matches方法完成对已绑定的正则表达式和预处理字符串的匹配工作,返回值为boolean。

    最后看String的ReplaceAll方法:

    public String replaceAll(String regex, String replacement) {

    return Pattern.compile(regex).matcher(this).replaceAll(replacement);

    }

    该方法实际上还是依赖的Matcher中的replaceAll方法,由于一个Matcher实例是同时绑定一个正则表达式和一个被匹配字符串的。所以在Matcher内部的replaceAll方法在进行搜索匹配的时候就无需传入额外参数。具体代码,大家可以自行查看,此处节约篇幅不再赘述。

    三、常见正则表达式的案例

    接下来我们主要从日常较为普遍使用的一些案例中来深刻理解上述所有内容。

    1、Email地址

    通常我们的Email地址的格式主要是:

    3-18字符,可使用英文、数字、减号、点或下划线

    必须以英文字母开头,必须以英文字母或数字结尾

    点、减号、下划线不能连续出现两次或两次以上

    以上是腾讯QQ邮箱的要求,相对而言已算是较为复杂,接下来我么看如何实现它。首先,第一条要求:

    [-._a-z0-9A-Z]{3,18}

    满足第二条要求:

    [a-zA-Z][-._a-z0-9A-Z]{1,16}/w

    满足第三个条件:

    (?![-0-9a-zA-Z._]*(--|\.\.|__))[a-zA-Z][-._a-z0-9A-Z]{1,16}/w

    至于最后一个条件的匹配,我们使用否定顺序环视来实现,它要求右边界所有内容不能是如下的形式:0个或者多个(英文、数字、减号、点或下划线)加上两个连续减号或者点或者下划线。也就是说,右边如果由多个字符或者一个减号,点或者下划线,那是没事的,可一旦出现连续的减号,点或者下划线,那么就将立马被否定顺序环视匹配,进而不满足条件结束。

    其实上述对邮箱用户名的匹配算是比较严格的,一般用于匹配邮箱用户名的正则表达式则没这么严格,具体要求如下:

    由英文字母、数字、下划线、减号、点号组成

    至少1位,不超过64位

    开头不能是减号、点号和下划线

    由于比较简单,此处直接写出结果:

    [^-._][-._a-zA-Z0-9]{0,63}

    2、手机号码

    在看一个手机号码的正则表达式匹配情况,具体要求如下:

    中国的手机号码都是11位数字

    目前手机号第1位都是1,第2位取值为3、4、5、7、8之一

    最终的表述结果为:

    1[34578][0-9]{9}

    还有很多案例,此处为了使篇幅不至过长,到此为止。更多案例还有待大家自行测试。

    本文如有错误,望大家指出,相互学习。

    展开全文
  • 要写出正确的正则表达式,先要定义表达式规则。 方案1 (简单) 假设密码验证做如下规则定义: 最短6位,最长16位 {6,16} 可以包含小写大母 [a-z] 和大写字母 [A-Z] 可以包含数字 [0-9] 可以包含下划线 [ _ ] 和...
  • 正则表达式是用来匹配字符串的。它根据一套自定义的匹配规则来得到预期字符串。根据自定义的匹配规则,我们可以从字符串中得到0个或至少一个匹配结果,对于匹配结果我们就可以根据程序的需要进行后续的操作。

    正则表达式是用来匹配字符串的。它根据一套自定义的匹配规则来得到预期字符串。

    比如,有一段邮箱的字符串:“740974794@qq.com”,我想从这一段字符串中匹配出“@”后面的字符串,就可以用正则表达式自定义规则来匹配。

    根据自定义的匹配规则,我们可以从字符串中得到0个或至少一个匹配结果,对于匹配结果我们就可以根据程序的需要进行后续的操作。


    要点
    学习正则表达式要从以下这两个要点进行下手:

    1. 匹配规则
    2. 表达式的字符含义

    匹配规则

    正则表达式在要匹配的字符串中从左至右逐字搜索,逐字匹配。只有字符串中某个片段与匹配规则完全吻合,才算匹配成功。字符串中可以有一个或多个片段匹配成功,也可以没有匹配,即匹配失败。

    举个栗子

    匹配规则字符串匹配结果
    xiaoyang“xiaoyangblogt.duapp.com”“xiaoyang”(1处匹配)
    a“xiaoyangblogt.duapp.com”“a”(3处匹配)
    xiaoblog“xiaoyangblogt.duapp.com”匹配失败

    表达式的字符含义

    正则表达式的匹配规则是由字符组成的,其字符大致可以分为两类:一类是普通字符,另一类是特殊字符。无论哪种字符,它们的出现都是为了定义匹配规则,从而得到预期的匹配结果。下面来分别展示表达式中的这两种字符。

    普通字符
    像字母、数字、汉字、下划线等在正则中没有特殊意义的字符都是普通字符。比如上例中的”xiaoyang”,”a”,”xiaoblog”这些表达式中的字符都是普通字符。可能你会对普通字符的定义还是摸不着头脑,别着急,客官你继续往下看,对比特殊字符,你可能就会知道正则的普通字符有哪些了(因为除了特殊字符以外的字符都是普通字符 ~O(∩_∩)O~)

    特殊字符
    正则表达式的特殊字符按照作用我把它分为

    • 匹配特定字符集
    • 匹配自定义字符集
    • 通配符
    • 位置符
    • 转义字符
    • () 与 |

    特定字符集

    特殊字符字符含义
    \s匹配一个空白字符,包括空格,制表符,换页符
    \S匹配一个非空白字符,和\s正好相反
    \d匹配一个数字字符(0~9)
    \D匹配一个非数字字符,和\d正好相反
    \w匹配一个字母或数字或下划线字符
    \W匹配一个非字母、数字、下划线字符,和\w正好相反
    .(英文点)小数点,匹配除了换行符以外的任意一个字符

    举个栗子

    匹配规则字符串匹配结果
    \d\d“abc12““12”(1处匹配)
    a.\d“abc12″“bc1″(1处匹配)
    \D\d“abc12″“c1″(1处匹配)
    \S\s\d“abc 12″“c 1″(1处匹配)

    自定义字符集
    使用方括号”[]”特殊字符,能够匹配其中包含的任意一个字符;使用”[^]”字符,则与”[]”字符正好相反,其能够匹配其中所有字符之外的一个字符

    举个栗子
    下面举几个”[]”字符和”[^]”字符的例子:

    表达式表达式含义
    [aA@]匹配”a”或”A”或”@”其中的一个字符
    [^aA@]匹配除”a”,”A”,”@”之外的一个字符
    [f-k]匹配英文字母”f”到”k”中的一个字符
    [^f-k]匹配非除英文字母”f”到”k”之外的一个字符
    [f-k0-5]匹配英文字母”f”到”k”或数字”0″到”5″中的一个字符
    [^f-k0-5]匹配除英文字母”f”到”k”和数字”0″到”5″之外的一个字符
    [f-k178]匹配”f”到”k”或”1″或”7″或”8″中的一个字符

    结论
    由上可以看出:”[]”(或”[^]”)字符对于其中枚举的字符对应到规则上是“或”的关系,即一个”[]”(或”[^]”)字符只能匹配字符串中的一个字符。如[aA@]对应到规则上是”a”或”A”或”@”。另外,

    • 如果想枚举不连续的字符(一般是根据UTF-8字符集上的顺序),有多少写多少就可以,如[aA@];
    • 如果想枚举连续的字符,用”-“(英文减号)链接即可,如[a-z]。
    • 也可以这两方式混合写,如[f-k178]表示匹配字符”f”到”k”或”1″或”7″或”8″中的1个字符,[f-k0-5]表示匹配字符”f”到”k”或”0″到”5″中的1个字符。

    通配符
    正则表达式中的通配符是用来修饰匹配次数的。下表中列出了通配符和其作用

    通配符作用
    {n}作用对象重复n次
    {m,n}作用对象重复至少m次,至多n次
    {m,}作用对象重复至少m次
    ?作用对象重复0次或1次,相当于{0,1}
    +作用对象重复至少1次,相当于{1,}
    *作用对象重复0次或多次,相当于{0,}

    通配符的作用对象是指其在正则表达式中修饰的片段。

    • 如果正则表达式的单个字符(普通字符和特殊字符都可以)紧邻的下一个字符是通配符,那么该通配符的作用对象就是该单个字符。
    • 如果正则表达式中的小括号”()”后面紧邻的下一个字符是通配符,那么该通配符的作用对象是该括号中的表达式。括号中的表达式可以是一个或多个正则字符。

    关于小括号的作用,留到后面讲解。

    举个栗子
    下面表格是关于通配符的例子:

    匹配规则字符串匹配结果
    \d+“It’s cost $12.5″“12”(1处匹配)
    (\d123)+“123212341233333″“21234123”(1处匹配)
    \d{2,}“123212hy341233333““123212” ,“341233333”(2处匹配)
    \d{2,5}“123212hy341233333″“12321” ,“34123”(2处匹配)
    [a-zA-Z]{2}“123212hy341233333″“hy”(1处匹配)

    位置符

    位置符作用
    ^定位字符串开始的地方,该符号不匹配字符
    $定位字符串结束的地方,该符号不匹配字符
    \b定位字符串边界的地方,该符号不匹配字符
    \B定位字符串非边界的地方,该符号不匹配字符,和\b正好相反

    ^ ,$,\b,\B是有特殊意义的正则符号,它们本身不匹配任何字符。
    比如,

    ^sa,表示匹配以”sa”开头的字符串;

    sa$,表示以”sa”结尾的字符串。

    \b:相邻的\w和\W就是一个\b。

    举个栗子

    匹配规则字符串匹配结果
    ^aa“ccbbaacc”匹配失败
    ^aa“aaccbbcc”“aa”(1处匹配)
    aa$“aaccbbcc”匹配失败
    aa$“ccbbccaa““aa”(1处匹配)
    .\b.“123@qq.com”“3@” ,“q.”(2处匹配)
    c\ba” cabc”匹配失败
    a\b“aaaa*”“a”(1处匹配)
    \ba“*aaaabc”“a”(1处匹配)

    转义字符
    在正则表达式中,如果想匹配 . (点)字符本身怎么办呢?那就要用到转义字符了。
    转义字符格式:

    \ + 需要转义的字符。

    转义字符用于匹配在正则表达式中有特殊含义的字符。

    正则表达式中需要转义的字符有:

    ^
    $
    .
    (
    )
    [
    ]
    {
    }
    ?
    +
    *
    |
    \
    /

    如,
    正则表达式\(a+\)
    匹配字符串”(aa)(aabb)”
    结果是”(aa)”
    另外,
    如果匹配

    换行符(\n),
    回车符(\r),
    制表符(\t)

    等非打印字符时,也要用转义字符匹配。

    ()与|符号
    在正则表达式中,小括号()用于捆绑、打包字符片段,使括号内的字符片段作为一个整体,然后可以对其进行统一的操作
    那么,括号的作用有二:

    • 作为通配符的一个整体修饰对象
    • 括号内的字符片段匹配成功时,将匹配成功的字符片段作为副本保存起来,以供后续使用。

    对于上述第二个作用,如果要在当前表达式中引用括号中保存起来的片段,要用\ + 数字引用。

    比如,

    \1表示由左到右的第一个括号中存储的字符片段,
    \2表示第二个括号中存储的字符片段,
    ……
    以此类推。

    注意:
    引用的是已经匹配成功的片段副本,而不是括号中的正则表达式的模式。如果括号嵌套也没关系,因为括号引用是以左括号出现的顺序排序的。

    关于()的存储功能会在下一篇正则高级应用中详细讲解

    举个栗子

    匹配规则字符串匹配结果
    (abc)+a“abcabca”“abca”(1处匹配)
    (abc)wz\1“abcwzabcccc”“abcwzabc”(1处匹配)
    (\d)aa\1“1aa1aa2″“1aa1″(1处匹配)
    (\d(\w)a)\1\2“3wa3wawa3wa3raa”“3wa3waw”(1处匹配)

    竖线 |
    竖线”|”表示“或”,如a|b,表示匹配字符”a”或”b”中的一个字符

    举个栗子

    匹配规则字符串匹配结果
    (a|b)ootaootooboot“aoot” ,“boot”(2处匹配)
    (a|b)ootaboot“boot”(1处匹配)
    a|Text“aextText““a” ,“Text”(2处匹配)
    (ab|ef)+“ababef““ababef”(1处匹配)

    上例中a|Text,表示的是匹配字符”a”或”Text”,而不是”aext”或”Text.我们很容易误认为是第二种结果,如果要想得到第二种结果,规则应该这样写:(a|T)ext

    以上所有例子中的匹配附加条件都是:全局匹配,区分大小写,单行匹配

    展开全文
  • 正则表达式

    千次阅读 2021-02-27 16:00:43
    正则表达式 - 匹配规则基本模式匹配一切从最基本的开始。模式,是正则表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内...
  • 减号用在字符集“[…]”里表示一组字符,如: “[1-3]” —— 表示1到5中的任意一个字符,所以“&amp;amp;lt;H[1-6]&amp;amp;gt;”表示“&amp;amp;lt;H1&amp;amp;gt;”、“&amp;amp;lt;H2&...
  • 在Linux Shell 编程中,我们常需要用到 正则表达式 进行 文件的匹配在本篇文章中,我们对Linux shell 中的正则表达式 做一个总结,方便之后的shell 编写。参考文章:shell编程之正则表达式...
  • 正则表达式, 字符串的替换与分解 正则表达式 正则表达式主要用于字符串匹配, 由一些具有特殊意义的符号和常规字符组成, 例如: 特殊符号: $ () * + . [] ? \ ^ {} 常规字符组合: \d \D \w \W \s \S \p ....
  • 正则表达式:只能有数字或中文或字母组成chenzhe_n16292018-09-06一个正则表达式测试(只可输入中文、字母和数字)u0129242379192015-10-05js正则表达式限制文本框只能输入字母和汉字shu6shu7562010-07-14java正则...
  • 此外,JavaScript这种客户端的脚本语言也提供了对正则表达式的支持,现在正则表达式已经成为了一个通用的概念和工具,被各类技术人员所广泛使用。 在某个Linux网站上面有这样的话:"如果你问一下Linux爱好者最喜欢...
  • 收集整理了15个常用的javaScript正则表达式,其中包括用户名、密码强度、整数、数字、电子邮件地址(Email)、手机号码、身份证号、URL地址、 IPv4地址、 十六进制颜色、 日期、 QQ号码、 微信号、车牌号、中文正则...
  • :\w+\\)*\w+\.\w+$/ 16、 股票代码(A股) 例如: sz000858, SZ002136, sz300675, SH600600, sh601155 正则表达式: /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/ 17、 大于等于0, 小于...
  • L7-fitler 正则表达式简介   正则表达式源自于对人类神经系统如何工作的早期研究,Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。1956 年,一位叫 Stephen ...
  • 到目前为止,都是把正则表达式写在一对斜线内,比如/fred/,这是简写版本,完整写法是m//(模式匹配操作符),这里的m表示英文match(匹配),和之前看过的qw//类似,可以自行选择用于包围内容的一对字符作为边界 ...
  • 正则表达式正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),能够用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。html元字符因为 \ 和 " 或者 ’ ...
  • 正则表达式教程及常用正则表达式

    千次阅读 2016-12-07 01:22:52
    正则表达式教程、常用正则表达式以及正则表达式测试工具
  • 正则如下: /^[a-zA-Z][a-zA-Z\d_-]{5,19}$/ ^:匹配的开始 [a-zA-Z]:字母不区分大小写 ^[a-zA-Z]:首字母不区分大小写 [a-zA-Z\d_-]:字母、数字、下划线和减号;\d表示数字 {5,19}:6-20位 ...
  • 这次给大家带来验证用户设置的密码强度正则表达式,验证用户设置密码强度正则表达式的注意事项有哪些,下面就是实战案例,一起来看一下。...要写出正确的正则表达式,先要定义表达式规则。方案1 (简单)假...
  • 简言本文给出了两个密码强度的正则表达式...要写出正确的正则表达式,先要定义表达式规则。方案1 (简单)假设密码验证做如下规则定义:最短6位,最长16位 {6,16}可以包含小写大母 [a-z] 和大写字母 [A-Z]可以包含数字...
  • 正则表达式练习题

    2020-12-29 00:17:26
    正则表达式在线测试:http://tool.chinaz.com/regex/1、匹配整数或者小数(包括正数和负数)-?\d+(\.\d+)?-?表示-匹配0次或一次,\d表示整数,+表示匹配一次或多次,(\.\d+)?表示小数2、匹配年月日日期 格式2018-12-6^[1-9...
  • PHP通过正则表达式提取字符串中的手机号并判断运营商,简单快速方便,能提取多个手机号。下面通过本文实例代码给大家详细介绍,需要的的朋友参考下吧0. 简介PHP通过正则表达式提取字符串中的手机号并判断运营商,...
  • Linux 正则表达式详解

    2020-12-21 21:00:04
    一.linux文本查找命令在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。2.egrep : 扩展式grep,其使用扩展式...
  • 一.linux文本查找命令在说linux正规表达式之前,还介绍下linux中查找文本文件常用的三个命令:1.grep : 最早的文本匹配程序,使用POSIX定义的基本正则表达式(BRE)来匹配文本。2.egrep : 扩展式grep,其使用扩展式...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,589
精华内容 5,035
关键字:

正则表达式减号