正则表达式,看完这篇还是不够的。

看了好几次正则表达式,稍微碰到复杂的还是看不懂。

很多文章宣称,看完这编就够了。够了,真是够了,有多少人看完还是不会复杂表达式?大部分文章都没有去分析复杂例子,没有写任何体会。把教材基本语法说一说,就敢宣称,你懂了。

还是推荐https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md#41--%E6%AD%A3%E5%85%88%E8%A1%8C%E6%96%AD%E8%A8%80

配合在线练习来学习。

 

这次认真根据每个语法符号做了几个例子,比较清晰了。记录几点要点。

最基本要记住,正则表达式可以称为,贪婪得到子字符串的表达式。

1.正则表达式的基本目的就是查找目标字符串中符合表达式的 ‘子字符串’。

   1.1明确这个很重要。因为不同的语言会给表达式类附加很多功能和函数。match,find.等等。这些功能都是从这个基本目的引申出来的。千万别忘记了这些功能都是基于正则表达式的基本目的。

   1.2而且明确了这个目的也会帮助理解正则语法中的^和$符号。 记住^和$也是来找 ‘子字符串‘的,只不过^$同时出现,恰巧表达了整体匹配表达式的含义,表达出了 ‘子字符串’是整体字符串的特例的情况。

        理解^$同时出现的解释: 某个子串,必须开头匹配表达式,而且结尾也必须匹配表达式,那么如果存在匹配的子串,它也只能是整个字符串。

 

2.表达式的每个符号的语法还是要清晰的掌握。随便看一眼,是懂非懂,无济于事。

   2.1  [ ] ,表达的是  单个字符。所以才可以[^xxx],来表示 非某集合的单个符号。而 (||),表达的选择其中的字符串。(^||)是无法表达非字符的意思的。因为这个语法无法确定非之后,你需要字符的长度。它不会表达非的语法。而是表达开头匹配的意思。

               要表达非子串,必须依赖 预查功能, 仔细想想,(^||),无法表达长度,而且语法也没有支持它表达任意长度。所以必须依赖 否预查,

               一段语法表示你要查的东西,附加一个预查功能,还有一个重点依然是第一要点。会有很多子串满足 非子串的功能。 

 

3.表达式默认的是贪婪模式,所以很多时候,我们并没有输入^$,  但结果是整个字符串,而不是子串。当我们明确整个全匹配,最好加上^$,而不要依赖贪婪模式,这有助于我们理解正则表达式的本意。

  还有贪婪模式的方向是贪婪的包含,而不是贪婪的非包含,所以再表达 非的时候,往往表达式和我们想要表达的意思不同。

 

4.零宽度断言, 必须时刻清醒的认识到断言的意义是断言。是对左边或者右边的表达式进行判断的,就算符合,符合断言的表达式,是不会加到结果中的。所以是零宽度断言。

 

以几个例子来分析正则表达式。

常用语法

1.  . 代表一个任意字符。   * 号不是通配符, 在正则中,它是表示无限重复前面的表达式。它本身单独是没有作用的。

2. [ ] 表示的是选择出一个单个字符。 ( ) 这个符号有很多组合,是最容易混淆的。 (|  |) 表示选择  . ()表示子表达式,用于分组,或者 让某些符号起作用如()*,让子表达式可以重复。   (?=) 又可以表示断言。

3.    ^(?!.*apple).*$     是否含有apple,含有返回位置0,不含有不返回数字。 返回的数字,表示从那个位置开始进行下一个匹配。而我们一般的 表达式返回的是2个数字。表示这段区间是匹配的。从这段区间开始下一次表达式的匹配。

4.  断言语法又是个有 个性 的表达式。 后断言,写在某子表达式的后面。前断言又需要写在表达式的前面。太戏精了。都有不同的符号表达前后之分。为什么不都放在表达式的后面呢?

 

一。表示一个不包含apple 的字符串,该如何写。


如字符串为 this is an apple! 我们如何写一个表达式,让他不匹配 'this is an apple!'
1.(^apple)
这里^没有表示非的意思。^只能和[]单个字符来组合。这里的()表示了一个组,而不是选择符号。^表示的是 要 开头匹配表达式,也就是^符号的另外一个语法含义。
我是如何知道的? 点这里。https://regex101.com/r/IDDARt/76 输入 (^apple) 这个表达式。它就会告诉你。这个网址是你掌握表达式的利器。
2.[^a][^p][^p][^l][^e]
这样呢?那我 一个一个组合啊。聪明吗?毛线。仔细想想[]表示的是一个字符。那么这里表示的是 我要匹配5个字符,任意5个字符。只要1位置不是a,2位置不是p,3位置不是p,4l.5.e。 如果只有1或2个或6个以上字符。是不会匹配的。
3.再认真想想,我们的需求:表示一个不包含apple 的字符串。‘不包含apple’ 这个是一个修饰,而不是要找的东西。是不是很眼熟,这个不就是预查的语法意义吗,?= ?! ?<= ?<!
3.1首先必须加上^$,因为不加的话 是子串不包含apple,这个就太多匹配的了。不是我们的本意,我们要的是整个字符串不包含apple,而不是其中某子串不包含也可以。
3.2 那这样行不行? ^.*(?!apple).*$ 。初看是可以,其实也不行。因为正则表达式是贪婪匹配,可以匹配很多。this is an apple!中, 第一个 .* 可以匹配 this is an app .那那么后面只有le.也是符合表达式的。
3.3 想不出来,因为我是隐约记得有这个表达式,但是自己没去认真看,想自己推写出来。到这里卡壳了。
3.4... 往前预查,可以用.*来贪婪作弊。但是我们可以用往后预查吧。 已经得到的字符串,没法作弊吧。 ^.*(?<!apple)$ ,不行 ^.*(?<!apple).*$ 也不行。 仔细思考。因为他不是准确表示了不包含的意思。
^.*(?<!apple)$ 这个可以准确表示结尾不能是apple,但不是包含, ^.*(?<!apple).*$ 这个就离谱了,解释器可以可以通过末尾的 .* ,对字符床进行任何的切割来使他不包含apple。如这里.*可以表示ple!。又是作弊。
3.5 唯一想到的是 ^.*(?<!apple.*)$ 。但是它不是个合法的表达式。 看别人的写法吧。不想了。 ^((?!hede).)*$
3.6 ^((?!hede).)*$ ,某个字符的前面不包含hede,之后再对此类字符扩展。 恩。没想到还能这样写。 因为.*之后再描述它的限制,会让解释器利用.*来暴力匹配合适的情况。 而 (?!hede). .让解释器只有一种解释。恩。不错。。。

3.7 自己做密码验证又发现一个更简单的写法。 用空表达式的后查    ^(?!.*apple).*$  。可以匹配是否包含apple。并从0位置。开始继续下面的匹配。

 二,常见密码验证,必须包含大写字母,小写字母。长度9到16,而且只能是字母和数字。

^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{9,16}$

1.自己真是不容易才推出来。涉及到的语法细节,很多文章都没有介绍。首先我们的要求是必须包含。 含有此意思的语法符号又是断言语法(?xxx).但是想想,断言语法,是不包含断言语句的。也就是匹配之后是不包含数字,字母的。这个。。。

2.所以这里有个大部分文章没有讲的一个细节。如果  (?=) 之前,没有表达式的话,那么返回的不是匹配的子串,而是一个位置,position.   (?=.*[0-9]),这个的意思是返回出现数字之前的位置,而且可以有任意符号。那么对于abc123456789A

会返回除下A之前的位置的所有位置。如果我们加上^,那么把匹配缩到0位置。   所有 ^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])  这个会匹配含有小写,大写,数字的字符串的0位置。 

我是如何没有了解相关介绍,而自己推出来的?

还是我们的利器。https://regex101.com/r/IDDARt/13  。自己写例子。自己看右边的解释,一点一点测试推测,求证。

3.加上^返回了我们匹配的其实位置。那么这个时候才开始写匹配表达式。 因为已经包含了大写,小写字母,数字。 所以我们的 要求就变成了 长度了。所以后面写[0-9a-zA-Z]{9,16}$。结束。

4.再总结下,前面没有表达式直接写(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])    会返回一个位置,告诉你符合这些 预判条件的初始位置在那里。 因为我们是要求初始位置必须是0.所以加上^,看看是否匹配,或者说去掉非0位置的其他匹配。

  得到初始位置,就是我们下面语句匹配的开始位置。我们设定了为0,也就是字符开头。 我们只要长度和类型就可以。所以[0-9a-zA-Z]{9,16},并且必须包含结尾。$

5. 受这里启发。我发现表示不包含有个更简洁的表示方法。   ^(?!.*apple).*$

 

3.省份证。

(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)

很简单了。不解释。 

 

 其实仔细看下正则表达式语法真的很少了。

正则表达式的全部语法字符。

 

 

元字符

元字符描述
. 句号匹配任意单个字符除了换行符.
[ ] 字符种类. 匹配方括号内的任意字符.
[^ ] 否定的字符种类. 匹配除了方括号里的任意字符
* 匹配>=0个重复的在*号之前的字符.
+ 匹配>=1个重复的+号前的字符.
? 标记?之前的字符为可选.
{n,m} 匹配num个大括号之前的字符 (n <= num <= m).
(xyz) 字符集, 匹配与 xyz 完全相等的字符串.
| 或运算符,匹配符号前或后的字符.
\ 转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |
^ 从开始行开始匹配.
$ 从末端开始匹配.

 

 

               

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 简写字符集

 

正则表达式提供一些常用的字符集简写. 如下:

简写描述
. 除换行符外的所有字符
\w 匹配所有字母数字, 等同于 [a-zA-Z0-9_]
\W 匹配所有非字母数字, 即符号, 等同于: [^\w]
\d 匹配数字: [0-9]
\D 匹配非数字: [^\d]
\s 匹配所有空格字符, 等同于: [\t\n\f\r\p{Z}]
\S 匹配所有非空格字符: [^\s]
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\t 匹配一个制表符
\v 匹配一个垂直制表符
\p 匹配 CR/LF (等同于 \r\n),用来匹配 DOS 行终止符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

零宽度断言,

说人话:匹配表达式的附加条件,

我要找小红旁边的(断言)男孩子。所以我要找的是男孩子,小红的不要(零宽度)。

 

 

符号描述
?= 正先行断言-存在
?! 负先行断言-排除
?<= 正后发断言-存在
?<! 负后发断言-排除

 

  后面应该有

 后面不应该有

前面应该有

前面不应该有

 

其他语法规则

() ,表示分组,可用于后面来引用它,后向引用用于重复搜索前面某个分组匹配的文本。例如,\1代表分组1匹配的文本

\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。

下面列出了最常用的一些:

 

表4.常用分组语法
分类代码/语法说明
捕获 (exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
(?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
零宽断言 (?=exp) 匹配exp前面的位置
(?<=exp) 匹配exp后面的位置
(?!exp) 匹配后面跟的不是exp的位置
(?<!exp) 匹配前面不是exp的位置
注释 (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

 

 

 

 

 

 

 

 

 

 

最后还有平衡组/递归匹配

 

学习中途的理解

//思考一个表达式语法如何可以表示任何东西?首先必须有语法表示:
//某子段表达式出现0到无数次。只有掌握重复自己的技能,才有从有限到无限的可能。
//所以需要有1,表示子段的能力。2表示重复次数的能力。
//其次必须有1.表示某个符号的能力,2.表示任意符号的能力,3.表示某组符号中的一个的能力。那么这样的话,和前面的能力结合,理论上就可以表示任何东西。
//当然扩展开来,有一个非符号,在某些情况下,可以表达更简洁,特别注意非,首先是某个可以表示确定含义的语法(确定的长度和符号范围)才能去非。[]是确定的语法,确定了1长度。任意字符为范围。
//而对于匹配后的继续子匹配,可以在一次匹配中就表达出。需要扩展语法。java 用().
//其实 regex 晦涩就在于细节多,碎片学习的话,可能就会对于()的分组作用漏学。导致误认为是选择含义,产生各种疑惑。因为各种组合表示可以有多种语法表示,有的简洁,有的复杂。所以加大了看懂别人表达式的难度。
//[]是单个字符含义,()是选择和分组。{} 是表示重复概念。

 

 

 

 

1 . 校验密码强度

密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。

^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

2. 校验中文

字符串仅能是中文。

^[\\u4e00-\\u9fa5]{0,}$

3. 由数字、26个英文字母或下划线组成的字符串

^\\w+$

4. 校验E-Mail 地址

同密码一样,下面是E-mail地址合规性的正则检查语句。

[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?

5. 校验身份证号码

下面是身份证号码的正则校验。15 或 18位。

15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

6. 校验日期

“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

7. 校验金额

金额校验,精确到2位小数。

^[0-9]+(.[0-9]{2})?$

8. 校验手机号

下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)

^(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}$

9. 判断IE的版本

IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。

^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

10. 校验IP-v4地址

IP4 正则语句。

\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

11. 校验IP-v6地址

IP6 正则语句。

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

12. 检查URL的前缀

应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。

if (!s.match(/^[a-zA-Z]+:\\/\\//))
{
    s = 'http://' + s;
}

13. 提取URL链接

下面的这个表达式可以筛选出一段文本中的URL。

^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

14. 文件路径及扩展名校验

验证windows下文件路径和扩展名(下面的例子中为.txt文件)

^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

15. 提取Color Hex Codes

有时需要抽取网页中的颜色代码,可以使用下面的表达式。

^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

16. 提取网页图片

假若你想提取网页中所有图片信息,可以利用下面的表达式。

\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

17. 提取页面超链接

提取html中的超链接。

(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

18. 查找CSS属性

通过下面的表达式,可以搜索到相匹配的CSS属性。

^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

19. 抽取注释

如果你需要移除HMTL中的注释,可以使用如下的表达式。

<!--(.*?)-->

20. 匹配HTML标签

通过下面的表达式可以匹配出HTML中的标签属性。

<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>



常用正则表达式

一、校验数字的表达式

  • 数字:^[0-9]*$
  • n位的数字:^\d{n}$
  • 至少n位的数字:^\d{n,}$
  • m-n位的数字:^\d{m,n}$
  • 零和非零开头的数字:^(0|[1-9][0-9]*)$
  • 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(\.[0-9]{1,2})?$
  • 带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})$
  • 正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$
  • 有两位小数的正实数:^[0-9]+(\.[0-9]{2})?$
  • 有1~3位小数的正实数:^[0-9]+(\.[0-9]{1,3})?$
  • 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$
  • 非零的负整数:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$
  • 非负整数:^\d+$ 或 ^[1-9]\d*|0$
  • 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  • 非负浮点数:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$
  • 非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$
  • 正浮点数:^[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]*))$
  • 负浮点数:^-([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]*)))$
  • 浮点数:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

校验字符的表达式

  • 汉字:^[\u4e00-\u9fa5]{0,}$
  • 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  • 长度为3-20的所有字符:^.{3,20}$
  • 由26个英文字母组成的字符串:^[A-Za-z]+$
  • 由26个大写英文字母组成的字符串:^[A-Z]+$
  • 由26个小写英文字母组成的字符串:^[a-z]+$
  • 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
  • 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$
  • 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  • 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  • 可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+
  • 禁止输入含有~的字符:[^~\x22]+

三、特殊需求表达式

  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$
  • 手机号码:^(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}$
  • 电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  • 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  • 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)
  • 身份证号(15位、18位数字),最后一位是校验位,可能为数字或字符X:(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)
  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$
  • 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$
  • 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
  • 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  • 钱的输入格式:
    1. 有四种钱的表示形式我们可以接受:"10000.00" 和 "10,000.00", 和没有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$
    2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
    3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
    4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$
    5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 "10" 和 "10.2" 是通过的:^[0-9]+(.[0-9]{2})?$
    6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$
    7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
    8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
    9. 备注:这就是最终结果了,别忘了"+"可以用"*"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$
  • 中文字符的正则表达式:[\u4e00-\u9fa5]
  • 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
  • 空白行的正则表达式:\n\s*\r (可以用来删除空白行)
  • HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? /> ( 首尾空白字符的正则表达式:^\s*|\s*$或(^\s*)|(\s*$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
  • 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
  • IP地址:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))

 

posted @ 2019-09-07 06:41  琴鸟  阅读(1080)  评论(0编辑  收藏  举报