JavaScript系列学习笔记 —— 正则表达式以及JS和Java的写法区别

39 篇文章 0 订阅

目录

一、概念详解

二、基本结构

三、语法类型

       普通字符

       非打印字符

       特殊字符

       限定符

       定位符

四、语法案例

       文本验证定位符

       限定符

       选择匹配符

       字符匹配符

五、开发时常见的正则表达式

六、JavaScript与Java正则表达式的写法


一、概念详解

       正则表达式描述了字符串的匹配模式通过普通字符a~z或A~Z)和特殊字符(称为“元字符”)来构建文本字符串的匹配模式用来检查一个字符串是否含有某个子字符、字符串或是否符合指定格式,从而将匹配到的子字符或字符串的删除和修改操作,亦或者对字符串的子字符或子字符串的添加和查询操作。

二、基本结构

       一个正则表达式是由普通字符以及特殊字符组成的文字匹配模式。文字主体在该模式下与指定模式进行匹配,查找一个或多个子字符或子字符串。

       该语法格式为:/ 匹配模式 /

三、语法类型

3.1、普通字符

       普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

3.2、非打印字符

       非打印字符指在计算机中有一些字符是确确实实存在,但是它们不能够显示或者打印出来。在ASCII码表中值在0-31的为控制字符,无法显示和打印

字符

描述

\cx

匹配由x指明的控制字符。如\cM 匹配Control-M或回车符。x的值必须为 A-Z 或 a-z 之一。

\f

匹配换页符。等价于\cL

\n

匹配换行符。等价于\cJ

\r

匹配回车符。等价于\cM

\s

匹配任何空白符,包括空格、制表符、换页符等

\S

匹配任何非空白字符

\t

匹配一个制表符

\v

匹配一个垂直制表符

3.3 特殊字符

       特殊字符就是一些含有特殊含义的字符,例如Laoye*中的*可以表示为任何字符。如果想要查找字符串中的*符号,则需要对*进行转义。

字符

描述

$

匹配输入字符串的结尾位置

例如$ 可以匹配 "Laoye" 的结尾位置为5

()

标记一个子表达式的开始和结束位置

*

匹配前面的子表达式零次或多次。例:zo* 能匹配到“z”和“zoo”

+

匹配前面的子表达式一次或多次。例:zo+ 能匹配到“zo”和“zoo”,但不能匹配“z”

.

匹配除换行符\n之外的任何单字符

[

标记一个中括号表达式的开始

?

匹配前面的子表达式零次或一次

\

将下一个字符标记为特殊字符、或原义字符、或向后引用等

^

匹配输入字符串的开始位置,若在方括号中使用,表示不接受该字符集合

{

标记限定符表达的开始

|

匹配两者之间的任意一个

例如a|o 可以匹配 "Laoye" 中的a或o

3.4 限定符

       限定符用来指明匹配的字符要出现多少次才能满足匹配。

字符

描述

*

匹配前面的子表达式零次或多次。

例如zo* 能匹配 "z" 以及 "zoo"

+

匹配前面的子表达式一次或多次。

例如zo+ 能匹配 "zo" 以及 "zoo",但不能匹配 "z"

?

匹配前面的子表达式零次或一次。

例如do(es)? 可以匹配 "do" 以及 "does" 

{n}

n 是一个非负整数匹配的字符 = n

例如o{2} 不能匹配"Bob"中的 'o',但是能匹配"food"中的两个o

{n,}

n 是一个非负整数匹配字符 >= n

例如o{2,} 不能匹配"Bob"中的 o,但能匹配"fooood"中的所有o

{n,m}

m 和 n 均为非负整数,n <= 匹配的字符 <= m

例如o{1,3} 将匹配 "fooood" 中的前三个o

3.5 定位符

       定位符用来描述字符串或单词的边界。^和$分别指字符串的开始与结束,\b描述单词的前或后边,\B表示非单词边界。

四、语法案例

4.1 文本验证定位符

       (1) 用 ^ 匹配目标字符的开始位置

            例如:“L”只和“Laoye”中的L匹配。因为L在第一位,如果L在其他位置则不匹配其他位置的L,例如 /^L/。

       (2) 用 $ 匹配目标字符的结尾位置

            例如:“e”只和“Laoye”中的e匹配。因为e在最末尾,如果e在其他位置则不匹配其他位置的e,例如 /e$/。

       个人观点:^ 和 $ 定位符只对主体的头部或尾部的字符进行匹配,而且^只有位于匹配字符的前面,$位于匹配字符的后面,它们才具有定位的作用。

       (3) 用 \b 匹配边界字符

            例如:“e\b”只和“Hello Laoye”中Laoye的e匹配。因为\b在e的右边,表示e是末尾的边界,同理如果\b是在e的左边,则表示e的边界是起点。

       (4) 用 \B 匹配非边界字符

            例如:“e\B”只和“Hello Laoye”中Hello的e匹配。因为Hello中的e既不在起点边界也不在末尾边界。注意的是\B只有在右边才能起作用。

4.2 限定符

       (1) 用 * 限定至少连续出现零次以上

            “*”元字符规定其前导字符或者组合项必须在主体中连续出现零次或多次(即N >= 0)。

            例如:“/eg*/”中的g要么不出现,要么就连续出现N次。所以,可以与目标对象easy、ego、egg等在e后面连续0个或者N个的字符串向匹配。

       (2) 用 + 限定至少连续出现一次以上

            “+”元字符规定其前导字符或者组合项必须在主体中连续出现一次或多次(即N >= 1)。

            例如:“/eg+/”中的g要么出现一次,要么就连续出现N次。所以,可以与目标对象ego、egg等在e后面连续0个或者N个的字符串向匹配。和 * 元字符不同的是,easy中e后面并没有出现g,所以不匹配。

       (3) 用 ? 限定最多只出现一次

            “?”元字符规定其前导字符或者组合项必须在主体中连续出现零次或一次(即0 <= N <= 1)。

            例如:“/eg?/”中的g只能出现一次。所以,可以与目标对象ego等e后面只出现一次的字符串相匹配。与 * 和 + 元字符不同的是,easy和egg中的e后面要么没有出现g要么出现了2次,所以不匹配。

       (4) 用 {N} 限定连续出现的N次

            规定前导字符或者组合项连续出现n次(即次数 = N)。

            例如:“o{2}”中o只能出现2次。不能与job中的o匹配,但是与book中的两个o相匹配,也可以和boook中的任意两个匹配。

       (5) 用 {N,} 限定至少连续出现N次以上

            规定前导字符或者组合项至少连续出现n次(即次数 >= N)。

            例如:“o{3,}”中o至少出现3次。不能与book中的o匹配,但是和boook中或者boooook中的任意三个连续的o相匹配。

       (6) 用 {N,M} 限定至少连续出现N次,最多连续出现M次的字符

            规定前导字符或者组合项连续出现n次(即N <= 次数 <= M)。

            例如:“o{2,4}”中o至少出现2次,最多出现4次。既可以匹配book中的两个o,又可以匹配booook中的任意两个连续的o或者4个o

4.3 选择匹配符(只需明白)

       选择匹配符“|”用于选择匹配两个选项中的任意一个,其两个选项是“|”字符两边尽最大可能的表达式。

       例如,“abcd|efgh1”匹配的是“abcd”或“efgh1”,而不是“abcd1”或“efgh1”。如果想要匹配“abcd1”或“efgh1”,应该使用括号创建子表达式,即“(abcd|efgh)1”。

4.4 字符匹配符

       (1) [ ... ]

       匹配方括号中包含字符集中的任意一个字符。例如,“[abc]”可以与a、b、c中的任何一个字符匹配。

       (2) [ ^... ]

       匹配方括号中未包含的任意一个字符。例如,“[^abc]”可以与a、b、c之外的任何一个字符匹配。只要字符“^”不是出现在第一个“[”后面,就还是字面意义上的“^”。

       (3) [ a-z ]

       匹配指定范围内的任何字符。例如,“[1-9]”匹配1到9之间的任何数字字符。[a-z]匹配a到z之间的任何字符。

       (4) [ ^a-z ]

       匹配不在范围内的任何字符。例如,“[^1-9]”匹配不在1到9之间的任何字符。[^a-z]匹配不在a到z之间的任何字符。

       (5) \w 与 \W

       \w匹配任何单字字符。即英文字母、数字字符以及下划线,等效[A-Za-z0-9_]。\W正好与之相反,匹配任何非单子字符,等效[^A-Za-z0-9_]

       (6) \s 与 \S

       \s匹配任何空白字符,包括空格、制表符、回车符、换行符等,等效[\f\n\r\t\v]。而\S正好与之相反,匹配任何非空白字符。

       (7) \d 与 \D

       \d匹配任何一个数字字符,等效于[0-9]。而\D正好与之相反,匹配任何一个非数字字符。

五、开发时常见的正则表达式

内容

正则表达式

手机号码

^[1][3,4,5,7,8][0-9]{9}$

移动号段: 134-9,147,150-2157-9,170,178,182-4,187-8

联通号段: 130-214-6170-15-6185-6

电信号段: 133,149,153,170,173,177,180-1,189

评注:^规定第一位是1、第二位是3,4,5,7,8、$规定后面的9位数字是0-9中的任意一个。

邮箱

^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

中文字符

[u4e00-u9fa5] 

URL

^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$

HTML格式

<(.*)>.*<\/(.*)>|<(.*) \/>

评注:<>、</>和< />里面的字符均要匹配子表达式的规则模式。其中“.*”字符表示的是,至少0个的字符都要不是换行符\n

QQ

[1-9][0-9]{4,} 

评注:腾讯QQ号从10000开始 

身份证

^\d{6}(18|19|20)?\d{2}(0[1-9]|1[012])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$

评注:中国的身份证为15位或18位 

六、JavaScript与Java正则表达式的写法

//【JavaScript的验证写法】
//方式一
var Str = "验证文本";
var Reg = new RegExp(/正则表达式/);
if (Reg.test(Str)) {
    console.log("符合条件");
} else {
    console.log("不符合条件");
}

//方式二
var Str = "待验证文本";
if (/正则表达式/.test(Str)) {
    console.log("符合条件");
} else {
    console.log("不符合条件");
}



//【Java的验证写法】
//方式一
String Str = "验证文本";
String Reg = "正则表达式";
if (Pattern.compile(Reg).matcher(Str).matches()) {
    System.out.println("符合条件");
} else {
    System.out.println("不符合条件");
}

//方式二
String Str = "验证文本";
if (Str.matches("正则表达式")) {
    System.out.println("符合条件");
} else {
    System.out.println("不符合条件");
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值