×

正则表达式

正则表达式(正则表达式中的*和*?的区别是什么?)

admin admin 发表于2023-04-08 11:57:11 浏览80 评论0

抢沙发发表评论

本文目录一览:

什么叫正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

正则表达式名词解释

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

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

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

正则表达式是什么意思

分类: 电脑/网络 程序设计 其他编程语言

问题描述:

RT

解析:

正则表达式是搜索、替换和解析复杂字符模式的一种强大而标准的方法。如果你曾经在其他语言(如Perl)中使用过它,他们的语法非常相似,那么你仅仅阅读一下re模块的摘要,大致了解其中可用的函数和参数就可以了。-正则表达式

字符串也有很多方法,可以进行搜索(index, find, 和 count), 替换(replace)和解析 (split), 但他们仅限于处理最简单的情况。搜索方法查找单个和固定编码的子串,并且他们总是大小写敏感的。对一个字符串s, 如果要进行大小写不敏感的搜索,则你必须调用 s.lower() 或 s.upper() 将s转换成全小写或者全大写,然后确保搜索串有着相匹配的大小写。replace 和 split方法有着类似的限制。-正则表达式

如果你要解决的问题利用字符串函数能够完成,你应该使用他们。他们快速、简单且容易阅读,而对于快速、简单、可读性强的代码等方面有很多内容。但是,如果你发现你用了许多不同的字符串函数和 if语句来处理一个特殊情况,或者你组合使用了 split 、join 等函数而导致用一种奇怪的甚至读不下去的方式理解列表,此时,你也许需要转到正则表达式了。-正则表达式

尽管正则表达式语法较之普通代码相对麻烦一些,但是却可以得到更可读的结果,与用一长串字符串函数的解决方案相比要好很多。在正则表达式内部有多种方法嵌入注释,从而使之具有自文档化 (self-documenting) 的能力。-正则表达式

正则表达式大全

废话不多说,直接附上常用的正则表达式!!!

1.数字: ^[0-9]*$

2.n位的数字: ^\d{n}$

3.至少n位的数字: ^\d{n,}$

4.m-n位的数字: ^\d{m,n}$

5.零和非零开头的数字: ^(0|[1-9][0-9]*)$

6.非零开头的最多带两位小数的数字: ^([1-9][0-9]*)+(.[0-9]{1,2})?$

7.带1-2位小数的正数或负数: ^(\-)?\d+(\.\d{1,2})?$

8.正数、负数、和小数: ^(\-|\+)?\d+(\.\d+)?$

9.有两位小数的正实数: ^[0-9]+(.[0-9]{2})?$

10.有1~3位小数的正实数: ^[0-9]+(.[0-9]{1,3})?$

11.非零的正整数: ^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$

12.非零的负整数: ^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$

13.非负整数: ^\d+$ 或 ^[1-9]\d*|0$

14.非正整数: ^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$

15.非负浮点数: ^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

16.非正浮点数: ^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

17.正浮点数: ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ -正则表达式

18.负浮点数: ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ -正则表达式

19.浮点数: ^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

1.汉字: ^[\u4e00-\u9fa5]{0,}$

2.英文和数字: ^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$

3.长度为3-20的所有字符: ^.{3,20}$

4.由26个英文字母组成的字符串: ^[A-Za-z]+$

5.由26个大写英文字母组成的字符串: ^[A-Z]+$

6.由26个小写英文字母组成的字符串: ^[a-z]+$

7.由数字和26个英文字母组成的字符串: ^[A-Za-z0-9]+$

8.由数字、26个英文字母或者下划线组成的字符串: ^\w+$ 或 ^\w{3,20}$

9.中文、英文、数字包括下划线: ^[\u4E00-\u9FA5A-Za-z0-9_]+$

10.中文、英文、数字但不包括下划线等符号: ^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$

11.可以输入含有^%',;=?$"等字符: [^%',;=?$\x22]+

12.禁止输入含有 ~ 的字符: [^~\x22]+

1.Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

2.域名: [a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?

3.InternetURL: [a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%=]*)?$

4.手机号码: ^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$

5.电话号码:("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX): ^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ -正则表达式

6.国内电话号码:(0511-4405222、021-87888822): \d{3}-\d{8}|\d{4}-\d{7}

7.身份证号(15位、18位数字): ^\d{15}|\d{18}$

8.短身份证号码(数字、字母x结尾): ^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$

9.帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线): ^[a-zA-Z][a-zA-Z0-9_]{4,15}$

10.密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线): ^[a-zA-Z]\w{5,17}$

11.强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间): ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

12.日期格式: ^\d{4}-\d{1,2}-\d{1,2}

13.一年的12个月(01~09和1~12): ^(0?[1-9]|1[0-2])$

14.一个月的31天(01~09和1~31): ^((0?[1-9])|((1|2)[0-9])|30|31)$

15.钱的输入格式:

16.xml文件: ^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$

17.中文字符的正则表达式: [\u4e00-\u9fa5]

18.双字节字符 :[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))

19.空白行的正则表达式: \n\s*\r (可以用来删除空白行)

20.HTML标记的正则表达式: (\S*?)[^]*.*?|.*? / (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)

21.首尾空白字符的正则表达式: ^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)

22.腾讯QQ号: [1-9][0-9]{4,} (腾讯QQ号从10000开始)

23.中国邮政编码: [1-9]\d{5}(?!\d) (中国邮政编码为6位数字)

24.IP地址: \d+\.\d+\.\d+\.\d+ (提取IP地址时有用)

25.IP地址: ((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

26.车牌

正则表达式基本知识

完整的正则表达式由两种字符构成:

通俗理解: 根据语言的规则,按照语法把单词组合起来,就会得到能传达思想的文本。

思维架构: 完整的正则表达式由小的构建模块单元组成。

Example One:

Example Two:

Example Three:

应用场景: 我们需要搜索的单词是 "grey" ,同时又不确定是否写作 "gray" ,就可以使用 正则表达式结构体[...] ( gr[ea]y )。它容许使用者列出某处期望匹配的字符,通常被称作 字符组 。-正则表达式

- : 连字符表示一个范围: H[123456] 等同于 H[1-6]

注意:

作用: [^ ... ] 替代 [...] , 这个字符组就会 匹配一个未列出的字符 。字符组中开头的 ^ 表示 "排除"

注意: 排除元字符必须紧挨在 [ 之后,连接元字符 - 紧挨在排除元字符 ^ 之后也算作连接元字符

作用: 元字符 . 是用来匹配任意字符的字符组的简便写法

概念: | 是一个简捷的元字符,它的意思是 或 ,能够把不同的子表达式组合成一个总的表达式,而这个总的表达式又能够匹配任意的子表达式。

注意: | 配合 () 可以限制代表子表达式的界限

Example:

元字符 ? 代表可选项。它只作用于之前紧邻的元素 (单个元素 或 使用 () 限制起来的元素) ,出现的次数为 0 或 1

Example:

应用基础: 在正则表达式中, () 能够 "记住" 它们包含的子表达式匹配的文本。

应用场景: 穷举所有可能出现的重复单词显然是不可能完成的任务。

反向引用概念: 反向引用是正则表达式的特性之一,它容许我们匹配与表达式先前部分匹配的同样的文本

反向引用需要与()配合: () 能够记忆其中的子表达式匹配的文本,不论这些文本是什么,元字符序列 \1 都能记住它们。在一个表达式中可以使用多个括号。再用 \1 、 \2 、 \3 等来表示第一、第二、第三组括号匹配的文本。-正则表达式

Example:

应用场景: 如果需要匹配的某个字符本身就是元字符,则需要使用转义符号 \ 。

正则表达式

regular expression是计算机科学中的一个概念。正则表达式使用单个字符串来描述匹配一系列符合某个句法规则的字符串。

g全文搜索,i忽略大小写,m多行搜索

具有特殊意义的专用字符,用来规定其前导字符

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

不同组合中的元字符有不同的意义,举例

可以使用[]来构建一个简单的类

var reg = /[abc123]/;

创建一个单字符的类,代表这个字符可以是a,可以是b,可以是c,可以是1,...可以是3。

可以使用^来进行取反,

var reg = /[^abc123]/;

代表着这个单字符可以是任何其他的单字符,除了a,b,c,1,2,3之外。

如果要匹配单个字符,让单字符只能取数字的话,可以使用字符类

写成:

var reg = /[0123456789]/;

这么写比较麻烦,所以可以使用范围类,我们可以使用x-y来连接两个字符,表示从x到y的任意字符,是个 闭区间 ,意味着 包含x和y本身 ,这样,我们要匹配单个数字就可以写成:

var reg2 = /[0-9]/;

要匹配所以的单个字母,可以写为

var reg3 = /[a-zA-Z]/;

上面创建了一些类,用来表示数组,字母等。但是这么写也比较麻烦,正则表达式提供了几个常见的预定义类来匹配常见的字符

有了这些预定义类,写一些正则就比较方便了,比如我们希望匹配一个ab+数字+任意字符的字符串,就可以写作:

var reg = /ab\d./;

正则表达式还提供了几个常用的边界匹配字符

^如果不写在[]内的话,不代表取反,代表以xxx开头,例如: var reg = /hello/; 代表以hello开头,相应的也有$表示为以xxx结尾,举例说明:

单词边界

之前写的方法都是一一匹配的,但是如果希望匹配一个连续出现很多次的字符,例如数字的字符串,不需要写成 \d\d\d\d ,我们可以使用量词

使用举例:

上面提到的{n,m},如果出现多次,只要是n-m中的值都满足条件,到底是按照n还是m来匹配。 量词在默认条件下是尽可能多的匹配的,即默认贪婪模式

var reg = /\d{3,5}/g; '123456789'.match(reg); //{"12345","6789"}

与贪婪模式相对的,就有非贪婪模式,即尽可能少的匹配,一旦成功匹配之后不再继续尝试,在后面加上?即可

var reg2 = /\d{3,5}?/g; '123456789'.match(reg); //{"12345","6789"}

上面的量词解决的是单个字符重复多次的问题,如果我们需要匹配重复的多个字符,比如匹配hello出现20次,如果写成hello{20}意味着是hell+o出现20次,o自己重复20次,而不是整个hello重复20次。-正则表达式

我们可以使用分组()来解决这个问题,写成:

/(hello){20}/g;

对于上面的情况,如果我们希望匹配hello或者world出现20次,可以通过使用 | 进行或操作

/(hello|world){20}/g;

举例: good(?=Bayon) 匹配后面有Bayon的good

检测字符串参数中是否存在正则表达式模式,存在返回true不存在返回false

用于正则表达式模式在字符串中运行查找,如果exec()找到了匹配的文本,则返回一个结果数组,否则返回null

除了数组元素和length属性之外,exec()方法返回对象还包括两个属性。

举例说明:

search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。

search方法不执行全局匹配,它将忽略标志g,同时也忽略正则表达式对象的lastIndex属性,总是返回字符串的第一个匹配的位置

match()方法将检索字符串,以找到一个或者多个与regexp匹配的文本。regexp是否有全局g标志会影响结果。

关于string对象的replace方法,一般可以传入两个字符串,但是只能replace一次,如果把第一个参数传入regexp的话,就可以是replace变得灵活。

经常使用split方法把字符串分割为字符数组

'a,b,c,d'.split(","); // ["a","b","c","d"];

相应的,也可以使用regexp进行切割:

"a1b2c3".split(/\d/); // ["a","b","c","d"]