From 46af8e3ea07bb1f03304e8558c7747ff24da6228 Mon Sep 17 00:00:00 2001
From: Falak
+
+g@e<2DDml7E=_3j
z!Ys6OGrpZDt2P!0OOuJ$Ic?K8OxJ$BpZ<8b`iG-rFIR+oso#RB-ppv46~dHRgnj~n
z#u@b_(663}TXE_C(wn+$sF(d@FhMQs^Og3Rq
MvLiUpp
zH9siDTaDvhW5wG*a6hh~672UVzG&;a3)Ff$fZRk-i(JCsftrh`_(a@I4QE?9$_7P(
z*@WC24b)RUs=99F;6>a1o
+rDdGW%w3xve2Y4`xd6~kFHRqMJ|V4_wP}C7#!1>^5VeRLZdw;Z1TR(xxEYQl
zmnBG&(_e2
#mpquuHF
zv|~`y^rzh&$ih9?es9`>O)#&v<%2!86eJ
+
+
+
+## 什么是正则表达式?
+
+> 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
+
+
+一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式.
+例如"Regular expression"是一个完整的句子, 但我们常使用缩写的术语"regex"或"regexp".
+正则表达式可以用来替换文本中的字符串,验证形式,提取字符串等等.
+
+想象你正在写一个应用, 然后你想设定一个用户命名的规则, 让用户名包含字符,数字,下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑.
+我们使用以下正则表达式来验证一个用户名:
+
+
+
+
+"the" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/dmRygT/1)
+
+正则表达式`123`匹配字符串`123`. 它逐个字符的与输入的正则表达式做比较.
+
+正则表达式是大小写敏感的, 所以`The`不会匹配`the`.
+
+
+"The" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/1paXsy/1)
+
+## 2. 元字符
+
+正则表达式主要依赖于元字符.
+元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍:
+
+|元字符|描述|
+|:----:|----|
+|.|句号匹配任意单个字符除了换行符.|
+|[ ]|字符种类. 匹配方括号内的任意字符.|
+|[^ ]|否定的字符种类. 匹配除了方括号里的任意字符|
+|*|匹配>=0个重复的在*号之前的字符.|
+|+|匹配>1个重复的+号前的字符.
+|?|标记?之前的字符为可选.|
+|{n,m}|匹配num个中括号之前的字符 (n <= num <= m).|
+|(xyz)|字符集, 匹配与 xyz 完全相等的字符串.|
+|||或运算符,匹配符号前或后的字符.|
+|\|转义字符,用于匹配一些保留的字符 [ ] ( ) { } . * + ? ^ $ \ |
|
+|^|从开始行开始匹配.|
+|$|从末端开始匹配.|
+
+## 2.1 点运算符 `.`
+
+`.`是元字符中最简单的例子.
+`.`匹配任意单个字符, 但不匹配换行符.
+例如, 表达式`.ar`匹配一个任意字符后面跟着是`a`和`r`的字符串.
+
+
+".ar" => The car parked in the garage.
+
+
+[在线练习](https://regex101.com/r/xc9GkU/1)
+
+## 2.2 字符集
+
+字符集也叫做字符类.
+方括号用来指定一个字符集.
+在方括号中使用连字符来指定字符集的范围.
+在方括号中的字符集不关心顺序.
+例如, 表达式`[Tt]he` 匹配 `the` 和 `The`.
+
+
+"[Tt]he" => The car parked in the garage.
+
+
+[在线练习](https://regex101.com/r/2ITLQ4/1)
+
+方括号的句号就表示句号.
+表达式 `ar[.]` 匹配 `ar.`字符串
+
+
+"ar[.]" => A garage is a good place to park a car.
+
+
+[在线练习](https://regex101.com/r/wL3xtE/1)
+
+### 2.2.1 否定字符集
+
+一般来说 `^` 表示一个字符串的开头, 但它用在一个方括号的开头的时候, 它表示这个字符集是否定的.
+例如, 表达式`[^c]ar` 匹配一个后面跟着`ar`的除了`c`的任意字符.
+
+
+"[^c]ar" => The car parked in the garage.
+
+
+[在线练习](https://regex101.com/r/nNNlq3/1)
+
+## 2.3 重复次数
+
+后面跟着元字符 `+`, `*` or `?` 的, 用来指定匹配子模式的次数.
+这些元字符在不同的情况下有着不同的意思.
+
+### 2.3.1 `*` 号
+
+`*`号匹配 在`*`之前的字符出现`大于等于0`次.
+例如, 表达式 `a*` 匹配以0或更多个a开头的字符, 因为有0个这个条件, 其实也就匹配了所有的字符. 表达式`[a-z]*` 匹配一个行中所有以小写字母开头的字符串.
+
+
+"[a-z]*" => The car parked in the garage #21.
+
+
+[在线练习](https://regex101.com/r/7m8me5/1)
+
+`*`字符和`.`字符搭配可以匹配所有的字符`.*`.
+`*`和表示匹配空格的符号`\s`连起来用, 如表达式`\s*cat\s*`匹配0或更多个空格开头和0或更多个空格结尾的cat字符串.
+
+
+"\s*cat\s*" => The fat cat sat on the concatenation.
+
+
+[在线练习](https://regex101.com/r/gGrwuz/1)
+
+### 2.3.2 `+` 号
+
+`+`号匹配`+`号之前的字符出现 >=1 次个字符.
+例如表达式`c.+t` 匹配以首字母`c`开头以`t`结尾,中间跟着任意个字符的字符串.
+
+
+"c.+t" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/Dzf9Aa/1)
+
+### 2.3.3 `?` 号
+
+在正则表达式中元字符 `?` 标记在符号前面的字符为可选, 即出现 0 或 1 次.
+例如, 表达式 `[T]?he` 匹配字符串 `he` 和 `The`.
+
+
+"[T]he" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/cIg9zm/1)
+
+
+"[T]?he" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/kPpO2x/1)
+
+## 2.4 `{}` 号
+
+在正则表达式中 `{}` 是一个量词, 常用来一个或一组字符可以重复出现的次数.
+例如, 表达式 `[0-9]{2,3}` 匹配 2~3 位 0~9 的数字.
+
+
+
+"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+
+[在线练习](https://regex101.com/r/juM86s/1)
+
+我们可以省略第二个参数.
+例如, `[0-9]{2,}` 匹配至少两位 0~9 的数字.
+
+如果逗号也省略掉则表示重复固定的次数.
+例如, `[0-9]{3}` 匹配3位数字
+
+
+"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0.
+
+
+[在线练习](https://regex101.com/r/Gdy4w5/1)
+
+
+"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0.
+
+
+[在线练习](https://regex101.com/r/Sivu30/1)
+
+## 2.5 `(...)` 特征标群
+
+特征标群是一组写在 `(...)` 中的子模式. 例如之前说的 `{}` 是用来表示前面一个字符出现指定次数. 但如果在 `{}` 前加入特征标群则表示整个标群内的字符重复 N 次. 例如, 表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`.
+
+我们还可以在 `()` 中用或字符 `|` 表示或. 例如, `(c|g|p)ar` 匹配 `car` 或 `gar` 或 `par`.
+
+
+"(c|g|p)ar" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/tUxrBG/1)
+
+## 2.6 `|` 或运算符
+
+或运算符就表示或, 用作判断条件.
+
+例如 `(T|t)he|car` 匹配 `(T|t)he` 或 `car`.
+
+
+"(T|t)he|car" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/fBXyX0/1)
+
+## 2.7 转码特殊字符
+
+反斜线 `\` 在表达式中用于转码紧跟其后的字符. 用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符. 如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`.
+
+例如 `.` 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 `.` 则要写成 `\.`.
+
+
+"(f|c|m)at\.?" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/DOc5Nu/1)
+
+## 2.8 锚点
+
+在正则表达式中, 想要匹配指定开头或结尾的字符串就要使用到锚点. `^` 指定开头, `$` 指定结尾.
+
+### 2.8.1 `^` 号
+
+`^` 用来检查匹配的字符串是否在所匹配字符串的开头.
+
+例如, 在 `abc` 中使用表达式 `^a` 会得到结果 `a`. 但如果使用 `^b` 将匹配不到任何结果. 应为在字符串 `abc` 中并不是以 `b` 开头.
+
+例如, `^(T|t)he` 匹配以 `The` 或 `the` 开头的字符串.
+
+
+"(T|t)he" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/5ljjgB/1)
+
+
+"^(T|t)he" => The car is parked in the garage.
+
+
+[在线练习](https://regex101.com/r/jXrKne/1)
+
+### 2.8.2 `$` 号
+
+同理于 `^` 号, `$` 号用来匹配字符是否是最后一个.
+
+例如, `(at\.)$` 匹配以 `at.` 结尾的字符串.
+
+
+"(at\.)" => The fat cat. sat. on the mat.
+
+
+[在线练习](https://regex101.com/r/y4Au4D/1)
+
+
+"(at\.)$" => The fat cat. sat. on the mat.
+
+
+[在线练习](https://regex101.com/r/t0AkOd/1)
+
+## 3. 简写字符集
+
+正则表达式提供一些常用的字符集简写. 如下:
+
+|简写|描述|
+|:----:|----|
+|.|除换行符外的所有字符|
+|\w|匹配所有字母数字, 等同于 `[a-zA-Z0-9_]`|
+|\W|匹配所有非字母数字, 即符号, 等同于: `[^\w]`|
+|\d|匹配数字: `[0-9]`|
+|\D|匹配非数字: `[^\d]`|
+|\s|匹配所有空格字符, 等同于: `[\t\n\f\r\p{Z}]`|
+|\S|匹配所有非空格字符: `[^\s]`|
+
+## 4. 前后关联约束(前后预查)
+
+前置约束和后置约束都属于**非捕获簇**(用于匹配不在匹配列表中的格式).
+前置约束用于判断所匹配的格式是否在另一个确定的格式之后.
+
+例如, 我们想要获得所有跟在 `$` 符号后的数字, 我们可以使用正向向后约束 `(?<=\$)[0-9\.]*`.
+这个表达式匹配 `$` 开头, 之后跟着 `0,1,2,3,4,5,6,7,8,9,.` 这些字符可以出现大于等于 0 次.
+
+前后关联约束如下:
+
+|符号|描述|
+|:----:|----|
+|?=|前置约束-存在|
+|?!|前置约束-排除|
+|?<=|后置约束-存在|
+|?
+"[T|t]he(?=\sfat)" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/IDDARt/1)
+
+### 4.2 `?!...` 前置约束-排除
+
+前置约束-排除 `?!` 用于筛选所有匹配结果, 筛选条件为 其后不跟随着定义的格式
+`前置约束-排除` 定义和 `前置约束(存在)` 一样, 区别就是 `=` 替换成 `!` 也就是 `(?!...)`.
+
+表达式 `[T|t]he(?!\sfat)` 匹配 `The` 和 `the`, 且其后不跟着 `(空格)fat`.
+
+
+"[T|t]he(?!\sfat)" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/V32Npg/1)
+
+### 4.3 `?<= ...` 后置约束-存在
+
+后置约束-存在 记作`(?<=...)` 用于筛选所有匹配结果, 筛选条件为 其前跟随着定义的格式.
+例如, 表达式 `(?<=[T|t]he\s)(fat|mat)` 匹配 `fat` 和 `mat`, 且其前跟着 `The` 或 `the`.
+
+
+"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/avH165/1)
+
+### 4.4 `?
+"(?<![T|t]he\s)(cat)" => The cat sat on cat.
+
+
+[在线练习](https://regex101.com/r/8Efx5G/1)
+
+## 5. 标志
+
+标志也叫修饰语, 因为它可以用来修改表达式的搜索结果.
+这些标志可以任意的组合使用, 它也是整个正则表达式的一部分.
+
+|标志|描述|
+|:----:|----|
+|i|忽略大小写.|
+|g|全局搜索.|
+|m|多行的: 锚点元字符 `^` `$` 工作范围在每行的起始.|
+
+### 5.1 忽略大小写 (Case Insensitive)
+
+修饰语 `i` 用于忽略大小写.
+例如, 表达式 `/The/gi` 表示在全局搜索 `The`, 在后面的 `i` 将其条件修改为忽略大小写, 则变成搜索 `the` 和 `The`, `g` 表示全局搜索.
+
+
+"The" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/dpQyf9/1)
+
+
+"/The/gi" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/ahfiuh/1)
+
+### 5.2 全局搜索 (Global search)
+
+修饰符 `g` 常用语执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部).
+例如, 表达式 `/.(at)/g` 表示搜索 任意字符(除了换行) + `at`, 并返回全部结果.
+
+
+"/.(at)/" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/jnk6gM/1)
+
+
+"/.(at)/g" => The fat cat sat on the mat.
+
+
+[在线练习](https://regex101.com/r/dO1nef/1)
+
+### 5.3 多行修饰符 (Multiline)
+
+多行修饰符 `m` 常用语执行一个多行匹配.
+
+像之前介绍的 `(^,$)` 用于检查格式是否是在待检测字符串的开头或结尾. 但我们如果想要它在每行的开头和结尾生效, 我们需要用到多行修饰符 `m`.
+
+例如, 表达式 `/at(.)?$/gm` 表示在待检测字符串每行的末尾搜索 `at`后跟一个或多个 `.` 的字符串, 并返回全部结果.
+
+
+"/.at(.)?$/" => The fat
+ cat sat
+ on the mat.
+
+
+[在线练习](https://regex101.com/r/hoGMkP/1)
+
+
+"/.at(.)?$/gm" => The fat
+ cat sat
+ on the mat.
+
+
+[在线练习](https://regex101.com/r/E88WE2/1)
+
+## 额外补充
+
+* *正整数*: `^\d+$`
+* *负整数*: `^-\d+$`
+* *手机国家号*: `^+?[\d\s]{3,}$`
+* *手机号*: `^+?[\d\s]+(?[\d\s]{10,}$`
+* *整数*: `^-?\d+$`
+* *用户名*: `^[\w\d_.]{4,16}$`
+* *数字和英文字母*: `^[a-zA-Z0-9]*$`
+* *数字和应为字母和空格*: `^[a-zA-Z0-9 ]*$`
+* *密码*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
+* *邮箱*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$`
+* *IP4 地址*: `^((?:(?: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]?))*$`
+* *纯小写字母*: `^([a-z])*$`
+* *纯大写字母*: `^([A-Z])*$`
+* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
+* *VISA 信用卡号*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
+* *日期 (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
+* *日期 (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
+* *MasterCard 信用卡号*: `^(5[1-5][0-9]{14})*$`
+
+## 贡献
+
+* 报告问题
+* 开放合并请求
+* 传播此文档
+* 直接和我联系 ziishaned@gmail.com 或 [](https://twitter.com/ziishaned)
+
+## 许可证
+
+MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com)
diff --git a/README.md b/README.md
index e1f83e4..cb68020 100644
--- a/README.md
+++ b/README.md
@@ -3,6 +3,9 @@
MvLiUpp zH9siDTaDvhW5wG*a6hh~672UVzG&;a3)Ff$fZRk-i(JCsftrh`_(a@I4QE?9$_7P( z*@WC24b)RUs=99F;6>a1oVI64%D>{LYj#q=)~ISUj=>4zSfKkqc-{x$?E30r`2 zx^ZYh!Z=CDzMA*5G}qFs`9`?|iiqAtZ-8Kpi4m3@YFJ4_2tsL(u%UhMXHeoEVf_Sb z0~A`ow!SsLuPALz;J(K`ZWXzf%saAE! @qZwoBUd?NAj#f1ur=(Vd*NIl{*OhkUm8Q6sZ%opPoc%bbn1iD&U3!Y1 zyYN~4>5;>0QDep^gi}8QN&E4Pr0hDP*P7KORKpAweBQiI&bf}TKMfig<>u#lK3=zO z^PslwEnGX(?R1APlX%rn*-A;6(Wd}1f5<7q^DHLaEg{Rw(Yw2ewnjx-#veD%Ym3lf zg=bk3XRWUgUW?SfLpPrb+<6+rjNL MXz5+cgUNCr(1v~ADaDw@H)e 1G>(}eo8^z3rjv0B?nch1h<#n mE<;HyNkJ1VqHmH@NVdIh z`5;o*kekD*2U 5 zRj?i9X}hv@0in#V0>C33sI2_>8A(5ZFc=)i)%0|z`}_QCV3S;67OxxIXugJ(Lq?KA zbpK*?&P$8hZYQIGg)L^wc2IfUoOaIO)RR)h)-7(LQ}NceJ_K6hIL`YmOef|FE0V^) zezwvaF4?X~3mB}sWHi!ajL^eSoxz=~$umLqvW6d@)s05o7?8wdLn5ria|u5BVSNT2 zK$ufWGFLr#+1B+ffk|3uiu=2*EZ+E)2$0of_$H3x36xoeMh;3TqzY0LIv+AFbA4`J zrC1!Zm*WHTNwkgbowuHE(jZ7it2HP2CA)fLvd9Ey;^nLaLzT_Ml1aq=_-S_ZRdg`i zm(v=|a1>92ZfcP4o?;XeCf+%wdzmbZ?|q$Z0X#`tr)p!gh&Y2@h8t!Y_I8fTqN><^ zvStTGn{PO%8ZO^6^vS}XJh!Qr!{XbQWYIo$Tis2AGaHtZ%3Mxt)mss@y!^ebsR`ke zxcsWyq S19*&N|mjvVC#g9oSaPIx^$RZ&M+q2_@%_hohYv=BXG z+ce(wIkY?4U-2aPvENT-NLgA)v#+d3y+XZp%%-7IzPh WM7Jqa=*tPpUsb`7!c( zC7_;SZi~NsWLgiW5nmqDwz@DaBKqee>IHfrmUmA?SpQwSUlFJ)$Ug1s{}anA l!1c!mcxz36$2aoCwV#`f09i#`k)kHq0B0IisUUln>(#Ro* zx#5)85Jesg`Qc?B?Y8~7yRVULu(haJHEuo`J+e;XWCI`8>(iKPTC1!me3AfACGcp8 zf1q9jKxK|_F!=|n769rbTm$ SkR%YQ_$Qf-U_PYX#ek@P zw3|GnomM^ZAMJwf0JKy2dWHTk?fwU#|5OUi+`8v3-jU3wb?Fy{Zzcnri}D&j?L6RJ zHLQt3bNptZqS`T#2Ujgr=??>ME&wx6g+`mQ{1J`+nQ~a!_-{!UdS>Fu%BEM>e`waI zmn~9Js8I~1A1lXR^*FD;=s}h}yRo$|6#Um9=&Ax*OMN!upFL=%)LdG{iv&|7UrNu1 zaKG}Y`53F1{o54Wq$U5kg4T6iSK#x47*)JNDqZ4{{@x)wtNOs4OAf3CmR8!%V+TB$ zE-#r97B#LWLR_5mgAzXtFoYjj-Fw$5UpN{zU74+~x$a?=iX(DR0!7mx#g_8sD`+(| zA9quH!Hu I?oVIx=9Wo9H&ssf}S^AOf@^A iA4sOnjJ{-cfhr6Ww8AyW+3U?45GMqV?(G0dpmi)!n%elOG$ zjr5$Lh ^Fw1_0=AHJJ{8vd?(gRmQsX)NA=?Q-$!2eNQI1U?G7Ln;%CaEuHR|ntD%%PZ? zSf>*@LR9Sf%dlv~aJw04X3P%@cX^b@tFL;cAmPpKf^$RZf~RTrU_c)tYo=99%5|fD zvjM#sUt4LsMt*bk6J8r?5*TkI)T}%hXqch1FRe3vxwV*xue)p+TUu6BnBb#bG=p)* z4jqXaE>9DITv5LsAZx$1s9kis1-(Y-2 zqVu3q)f&}HW+mTV&dH#CX@QlmV3L|o2bS=RoLMxQ*SB;1ei&pdoF!B8= W zXWbv(->J*-;Ij*fB@|Chw0(r9Fuul#Q^Z?!z8l_{ZFsYyH6;L5yc;58CD>E;iRZlT zzO U}-AP=0PEp~}>g>4>H!gg*G{}gJFk7WWWwy`ECs9c} zyt^K2eJmk1xRLGb=~6n8q#v^!Q}_jvY4p^h ~-r9 z=3%>ge(r?Dw={~WrGjO?RoYbO+=Shr&5gy1!L7HFY1x5K+_?`m;U)t)TIb`MzWe_3 z`c5r54-q5WO{h)~8}*FMa_#UWLDIAP&Hal74Q_Xt`uNL@=V +rDdGW%w3xve2Y4`xd6~kFHRqMJ|V4_wP}C7#!1>^5VeRLZdw;Z1TR(xxEYQl zmnBG&(_e2
^HJUU6B^$;0Yz&k6DhX9EIs*XEf zq;t8urbBN^09#k6mle2Zzueb@79!0sP_j1j^*r+7lF9*T$PZ-8TFC_RzCRB}B0cf; z%dW{pW8~TpBwUX3$(>3uAlxfmd+paq@rClaN0gsJ2>UZXAK>T@I&ohuCis%uJXQP_ zJmf@=N46o9r*F8|#d!z*{Cq2>Z+op-&B)d&8k3Z%WBRuD;?2IFW8URT7#*B)7B-0m znqR)Ay@hoTCoL8X@9$m}#t_Z4n3|1t^5g(33!H_2mH0@!tF_(6a5+W({Bx4h{VA+T z_U%4U=qw~5sTZ?W@gi|cD%GdSs1NbXS`PcVqG77RO7rrD>5$5B!%qs{P3(fGX!$t4 z&H(BS`rf)B?dlUs7dPj^=VonCFx;@~JGalctW>;bTne*pH)M93cheIWvO>TrrP}1K ziH{fac;ioEDytJO9NMi33V5#)y90OQs6^0U5B4GBhSZ4Cyp3pPpGkWmTEOmG*4@!K zj>h{^Ic80%4P}F6gK8RE6MGWh(lGqyHXt0Pv`McfZX`QlRjk0R{aeFqD15IqpkPbN zTE$el`BZU >V 2D+BU2M+wSFN)k)2gL=C#U$ZRl2KVus(Sgcc`JKY@ zeCebfI*nJp!whQiGD`G#Aj_1!T@VRu(XZ}edpbKeWuW>mBo>PY=aevx?`>!;t!+XD zpIJQkQUZHjVKdH950p_l$$w5O*%=r-RnR9}i!#}K@+hClr|$N?&4mNKif)2n;*Q3q z((;~1fKu`Hr)MVNeD`Y)CMzqti&orTKe?G2xE+0d4eJEdzs^cC7Sovb8}?O(gpyP& ziW>Q~44x&V)V6C|>nJIbd?hKeV@H&&E*~C`9_O(<&v_giP)B0`q9( mdEG5RbZU^pLeZWW9GG8p3H|@&RVAg?-{Lp#$gn|XE!8C%u9I~-8X!)VP4NZ-nbe$X;SvyM++aUD=1}b3Eps41sV*lx}VYi4kin;(e5cw^$jXX zhuxe9$>1jje{Kyv{T8QvF!geHc~1UYCitq|fuooBT!iMlOJDi0w%~S+w*QwW`(DbV zqKCuWb4$fYbKW8!mrJX2i`*Hf2Ey2ZM9u@;7P6Dkf|5-S3Cry7xZ71=Oq5rdm1y}g zU&ugtADqxoS!Sj^ukBXO%v&q7Cg<|i<^G^+uOV}6L4jqRVva8+X;!7`?)n9==~@-4 z64O>i$8%>y`#b!670W<=YAS;C`6xHZee?*MJD8=jT?o(JCNm8*-%6Tli0QNh`M1z7 zAWu-1vsxz2l$!0oEAJeuZ!D`6n@vCx>QbwVgTv~hODi{g(`(AVKTEgEtB5I! U|lWOHZr_4NS{4tWFCBRw0^+&tF=ItV%DP{&*-67 zDw^3O)h;n(e_sMyvc4gj72DP2u5LJ%@2k%0n|pnVVQ{VUTj|RE)A^Vb0rW<7P!Dou z7BM3pYwY_r=Gq#MODAT)Rjxv&Ip4f4Y$DoP#gIR|XU+z onHkd) zrB%q~B-=46TvkDh1eol16hVddx>|VVR|O19%@NIh-%Ai}hG9KldKr*VofeGG@M ~{A79xDAX45-ZvwLl`L4hn&5fr(J}3*W3Fr(h3AfgC6%--LcGhqQH @+c3XF^u zrqVQkuUTHSaxGgwFHrZWlHx%*n_zZo?yfb~oq{GjRUt$Z_qH>y$AOUtB0ujsw`Mb@ zQ!s(2h&*>1f}rUxz{I(MyacYeu(78$AFp`2PRW%4`|`^%i5>L3VC?I)aXId7OI zKc4>%6QaP-Q@d^ugIa4VE)TJ^k%AJZ&R VP) R=bPm^n XG{!ljT~PVta^v3U7G<; 3shn!|=N*(Ju_x--!-0z~Ql8zp3x?BHof&oAL2R)t#ffV8NSAE~Ufco={I*NuNX- zJ|Uw;^$8}@nq?hcWU~T|`bD`20UAk#J(cJ(u36=gxpTQYW0%qgXRD_%UDas#SlOfJ zM<}%D(!8ZHo}EAhPIN?VU%JxSx@s`(d(oO*BpN~;d+2(PMVQfiRW@2&zV9W=@etA$ zuWga?5FYJq=lCm0Y4N7$*3(X5G%5KMw #u)j(F&Yorwfe?aRQ|hrFyFdj};Csr56 GfDj>_Eoy;XPR5Fea zc|y6L+`1P+Ia~fD<7!xH@;pnfPe|yyrE5-6qNX2@GU{Vwvg|isC&Ey(j0QQi`l%8s zcvG}3<&&0NAb*b}N!KnlXq{PepjD3JivP`dXSI7#_F}w__UZQ +Q2D0 z=U0q+h^6GLm{5r^+2SDq`wPg?S?Py@aTC_UcM`v7Lw=LmF{S0H5hIY({uT4weW1Yf zy;-H3`tKN06DTa$*^2(|AOWnx2Ix_e@qz4v-#iB5vRpeLJmqK4JARayA0``x@<3j- zy?RmPcjE*w#t(E#xLmn%?l-bPTDAw&Cx^om(hpk$ekGHR89?c?tHbf1mVDO%w%-r_ zO!ZeI6}kWz&6Jf-{LN2w!-4HLu H^+a7)CLjN#T2k_!% rFRhDrkN;%` zkp%#3e_Z4!i~j|8CeW(l67%fLKOP cE0`gaWe@o-NC*#2Pi#g#v$ z#bXiq0F0SzugU&`xF8Q~zgO$f&G2`BQBD9x+KY65`1J_r5CtmA&9XLa|MvgiiT8hy zDB=U?CfNKNy=f)~VD|ru0ssF${xXCB!l_{)4fH4h5&Bt)(pyJzH_84(b3|-a?FuzS zQR@+=UDqRgCl<$19vVgbr(Dj5Qs8I)@##N)?f_CS=Ae4vA3Obk5$9S?&0ojVhcl6f zI{E*>LJOxNh~bT@Gm{Lla=(>;iSujtfV`m!xIl!0C=~$}JqWy|zZ1f**?gM(r{L3| zV^CJsV-XINKd|Dmv5zSL*^TJE^wrbNArQ^@SC9)&0$O9{dLrqc{6h}~*))gvt99TI zS?5~-QuO039RFzHaCm-_3TpgqZ4bQ=HDE+q#cv)pd>oOe-xN?1=$x9zKZ4O860G8! zCfQ%L@ks^r@Bb}Gx%uR&{SCcon|vAA;^YH;d<%r2JnEr89SQmLrUt=N--CQ}PW}5b zVwVn5`8=i>{ybItJI(S5vMGaK4bA}k56Is01fRyQqPb5RrW#Jwpjpm#W^aTzwL&V> zc(K~!bm(DD-~E!^_9S7jy}P#)WXrQv{v~{U!NSfp)po3CH{T~3X-OfW8xS|t5tjSW z=o(r%^se}M0OPjf!iq=6OaXf-AUvIvrsx>mt8Iw99NiIrMldGhj9}9F6e|!EBqqF- zwwW<9ss0>^Me?=5?#>pab5X#03B3l};fTX7cfSWLkT5>F3?{?!6N@4MeM4*RYyLXQ zYl~}f5k>PNG&o>2q=8bMxtMFrxB`%$9I0xO7b<%-cm-CSJV%3MM2zQ{%Ve%&UdkIz zub}H$8>?^k;rLMJvkZrqh`<3X_cRFTVwYF-Gl+Hdwc8&0)ADO@<15WGgA_)+i)1qj zU%^*DVQ@DfI!nwiwUblTiS(_OxN)_dE*J<=1HV)!_e!SLH$6=XI_9npFHd2>f=flC ze#Y`3E0S<)P1dgj44v;B=6r6a^dpX rYWvDqq9XnlejUQZCNCXV;1eT2Oh4$z zNk;DubpL1vxhKG{nC^P3o7V+41hRUkeq2V#KGxO`cr!cr$p&ukSHKf;H}gg#N70hL zx_sqP%M?I&CQfP{_6J`Edht|bZq$-0ZZp1DJ}pp<*44{7Y8T@4o6>O)&v9o$WwzD| ziFtP K|L!r3EJLJte}{7jcNI+#UgC$= ;xG2n4v?WiV|c*TO|#ba2eHM82bPVF#ZRAo5 $YL7Yf#cDX5EjgsKsL*Z9I~hd@5dK-aW8PQ0zY-?XlauSB>=(l z9ltpLtEt?V^=;)1f*772)vRo(VrE!bwRyLwdskx^e=^c n&sp*KP&R!exWgd@Q<4sJDY3`5PCiq+}ij9Hdi1vPW)sf$})m zCrqZULDZN)IckfSL1AIRr3UsSo00IMZv{!6yj=TMcu!P;-@(fz$?ZG61s((0EIkRv zq0U?9P})=a==XrU>ZsMMBj%KC)(<4zs;V$CNfKkv $CL>ub9cGY zs=-YYy@yY}X{ZD3908losDj{uiFto?Dr9vlM iElF*uWRzbO=ktIASP!N~!WhKqJx4 z=?ZtIPX7{B{=7=#zS7blx*K`@x%H)QVYXRguUXevBjsd~e|qX=V7r$;2Fjwv*uJux z{WYB@DR Vt4a z;6?_Uxlu-V;w~2{0dm28H+|H;y^kKZ7^c5Ib3bb_@P(l2j(W`}PH?D>6sx%f;Xkz2 z1JM{k#Zrq=_c$4lyM@QiEUx#Vr65dAD2N*iceCFhF)puq{-DB}R%a|HZ5Hf&x_|jv z{(KUWhBIwBjh@TB9ZgyThsl+!;d7xX2{gFrpn;Iv?@TnG{ #mpquuHF zv|~`y^rzh&$ih9?es9`>O)#&v<%2!86eJ9C-Ot7A5kRek48>9tnNL7KYr3(#+yo7A{Gk`1$SAp$Q?z zJc2e11?Z^%YCZ2ibv!I!;FL_}zYAFPKvY<~*n3m(UjX|bPIC?o>2Zpo6u_lg`bP!+ zbI#&G+*^G-A^)EzE(841_j-};vwuA?^3cnl3lRO+0O1Qn0{`UdFgD6P2UrHTmOSo% z0R%4)K-8~Ltsfpc98Ng~*jONPJ;AK?FIcxc%w~KY(l7s+LhbkjfRXWs 5~*_?NDKx$xg`ZvE|hQX4@>w+ZN#P44(w z4?eaUyNzvpQ~&l9bE0@sLzA_-ifT=*y5Q9~eq?_;U6_96HMHTAipsLFgMbl{;tC!Z z?pEhJ-Jld?iVtAoin`?rAH&r3tIqI7?@HK{w8PZu^~{XNbhaCY;VLgCLjq1lLC znCe<4cac$M=p%J^NRx%xOx;Nhu0=BZ4;+2m{7 P4r^dP#O zV|)(MW#s+3WuhjjMD}xlaEt~I ci+zvnBd5Xa@k)#V>`X2 zCi6Y^YdcS^jvEu_1m+q(_ErIxjIbK`zyP(;1fm;#(;1>!X;ZCwH}X7=|IPl&%l#X4 zP>Uv0Qi3X@dQL4=223HL;qKyXj{U5{0e*D1>B_itPyMq*CiIqugNB4UHZ5Pnu*Ze; zR8*t>R^^O+J6m;Q^34;lV~9;P&X7(64(|#@3j_M~kV~1F BGpdE)4l@ zM0umDb3#0`&Qg$WxY3OCJ|($sU-lA^MiGxkJP*C8lK;h=%-=ZxOZ6sG=lGKCY>h$3 zJLPE=L^W`8q#C^fVPYM>fo4Y2Xw!btoFj3}O5%$i6SN)n^qImG2{Y1Q!C>`)1|zV) zAKTK>XoCQ_a7(RhM})g9wB}n;sP6MT$P4WXfd@pbxb+p=k_|en62WHeNz(4?g$JDt zcPiIu-A*WNCN;F_E6zKeSw^yOg=%a!+U{8NJF@L~H>3R?$-v&&gRu6|U6>Y8Cts&j zgW($eRzps(Rjo!-K69E^Fhbbs#@_9q3ZfAntXI5Qcy);n%J0Ts%A1i^ehzHVG^LXk z(|z9FJx6CCWIaeb*o|4FI)QuIm$czuMsz~$g(?SKe|kol#aytU|HYo%4@>;T!_F8W z`I5Wwwsd|)XW8$bnb6^73Y{K_45U1as yy}f! W7y *IWZT~58}h_cde|e0Xc+T;D*Gia zD|cBQUI4^|Y)Vx&zO}Qv7U6nRUV7|V#UC3iHL)q8+4SG{G+sf~$JY@yoER+lX--!j z`V+br;_+JGpw1R-=Cv)RO} M8eM>S1_r*^m?ZE!*%&>YS^X?UYRLEa5s=AMGku+Y)t zjix-omTj0As2;|bv9@QK!7kuDOYhlAq6H#WF2HVB^(c;PxlSFBL%*hm($0ZqCaA@# z*NqDO(6TL&7V%j~ditfkleO=|3M*EkdJmDN79A;r!74f1dKgX=)R(_teALEpr?| zW5%0!>Q+3_pQ#TjZeun3QZ^|9%hq+cbK)f%AqK;5Dg|t83qIH=r+Q8-7<9*6;ha9# z>AwSp5L)RDG&-7vQ2xaCtn#HW!$9%C<_B`zLGNjypW0~;9wU*-W3kC^^Hp;aOvjf# z?^+S0m*H-Fb-U!KRB&K0&+0YQ`C6vS)}OjG28`~`f+0IU#D1K`m%R*ApT4A5JTF$? zTv$yT?hT12DZMJkzuDw5Y%uYXPg7geu&c>G(+~#h<>w7;h}gY9XRQ`E;9}YO>&%A; zju=Kh3K(3E^HYCvk{= RzL-5Sd7Jw6VfgFE_3K7d6>cc;*Wv3;)9lhh#O z^*NgJKESPrK*m>CCwXOgv|he3;VtQ6P;ywBbyWc0%t?caifD~WGV3&b!{;q-`#9AT z^-)e;y{678+|#=S2&KWtkKaKX+7+9a+MjTMncNR@k$DET7q~^F6Qg-nwl7D;Fh=`i zBwc>PPyC>}`sn4FT;zplnXR `hO!lSJ+6ycpBY>vi>S={tRXrQu8Py} za1<`nQ7bW2Y%HeRHzf3ggrf?qn(9dK7JE>aef#H)*MTxw9xFQWZSx1Dy2tO~P(& >8$5HygP1IDWq>>7E0cBv0vd@~kC$ zqjvr6F`Y4Uvs=>UgdWLi?YHskG2U@|<4(df;JZai4x@8cU47`=tt?5Y$>$SmQkJ-O zh^WfC$+Pe}J!emBLp~h>Joxd{8py!!DNz>Bi=Ky+r?I`a$`HUBY(KRvn6=R}G&iSP z4za$$#11$$81y0ROpx1qb(}`9x>anuC*!&s#;WlARElrqT~!^!pS|$z^5^=B^-I#8 zYh9da9)gyvDH&Unm|Sb#fd)oqIJ1L%A>{>H00R_&Sbg@Hm(J%$YqVPb+sZU zuvOe-pC7AFL&nm>G5WO3VK*c9f>8AZ98aXxj0Jb5wSRMp*QR$$v<--YfqeV$NF69? z&47(z@uVBNwsMW8Dg^vElM-DrZgXI%g`abhO_oj=X0X5* t%AIa>b~1vt zZPj}UPB8M(HPc&T>VyU?=V)CvzY |QK=ZcrxVC}rh#WU@{Z zb`WB>rBCU!Kl>Q2szTnnl&AQ4Co^+vaDH s?W~%BFpy)0fuzaIxEkmJRPsP^8 z=yr7n^??vG{~}SgP@ORgX%!$7pnR_bUCQt!@*qOvviYG|$)gvmGH`}@72o7tc*ikS zP-J^-@rz9%V>@iB9LFRtV%}w<99G3qK3T5+D{hW@_K4{ejNuEa=z;kg$f7*Yq)BcT zL Z4$^3@%(0)t5(;vZjyP;De$0lAP`%+{V=_ zrl#_wfFkBq!ZNicaCtby21x@k%Wh^uB_eax8t6tmsrp3hXmJa>n5Z?sy9>y dY$7m= zXo~WCom}Rvgjm)b{g8ECNn@th8!FkB5+iTDjYO7+8iB3OP2$W>GBt1}GnwfcaV|dY z4{PK}QG|kMdwagaUL$b<77%%3Pt31!?!6XD -wnn%JaK|mbUc7tu^bYFqwQN`e@Io znD{W`&h@IKSue1>AycFgpe&W%-}Hsb2PD3`AUa4}F}U8iO8U22$uS#^(Z;HYt2p{X zDfwxjJIRACdCs&{GO)O?LMQ#3RnOVA@Ydim zo+;MW3US>DmSYVoFm;;>rs0K)sL(Le7?$g_Ow|jsp*;3T2CLldmG_pQK1|m+GzOu> zF>XN#>f^Y1SpGPneLct7P!{F#^pp0`B?t=*>Ba)%bC0J3b$Ue8^|*G43PIT{k%OT& zkV+G&e#y!Sgx`GGq<%l6`r9nYGiT?(cVx6)eP@1JuE(uW1)I1;ji_n3 9T6mDGP_QsG3-xM4|+D@38kz78J|%{g<=B zFbmvOd^h#MyN^b0Z>|PRC8(#VuMGBnb4R 5PGF@m9S_+Ilc7t7XQHcNA+~ zO_s^`eP ;7)$w32%Px@8J z>pc~h^5#T_=_x}LHnvhjXm(R(8NbWwfyH09`Duozf7LJK 3T53|l z1mdDewsRJ!f+vgW2g$B-LPAeO5bGS^pn-kG#Afx?m-E22z@kut=Vv)#)O4dJrdu(0 zEuJuez$&Y$+A$gDJ{B9!(@4S0;)e4Jrz6l0SVQz)F-hP?msE2EEWbW= lJn1&OUzL!R{FUla*SA2SxXnSKvZ6GAB!OYCGa x78>Un*0H^$2hGGJ}eIJB8;dt7q zVF`1!!)8Us>O_r{wje`b=eWkaZToQi!1Zxkes}oed@5n`k;7;u>yiB4ed+}enH=Ir zQG!Qhm%1DRpHCWUFNl^aS})R+{}Lb)qdB5GON*yK6*N9^4Ilb;*!KVLAoPD8f7NsU gpU~k&M$5rzmc?MbpjDrv-?>v$(!Nu6``+XK1==UaD*ylh diff --git a/README-zh-simple.md b/README-zh-simple.md index 2ae8001..6caf512 100644 --- a/README-zh-simple.md +++ b/README-zh-simple.md @@ -17,7 +17,7 @@
-
以上的正则表达式可以接受 `john_doe`, `jo-hn_doe`, `john12_as`. From 1bca89cd8894369634c32bddc5163e862ab9af28 Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmed+
![]()
Date: Fri, 11 Aug 2017 14:42:25 +0100 Subject: [PATCH 05/14] Rename readme --- README-zh-simple.md => README-cn.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README-zh-simple.md => README-cn.md (100%) diff --git a/README-zh-simple.md b/README-cn.md similarity index 100% rename from README-zh-simple.md rename to README-cn.md From e390ba3fb29325b213411658454a612fc93f540f Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmed Date: Fri, 11 Aug 2017 18:53:12 +0500 Subject: [PATCH 06/14] Add translations section in readme --- README-cn.md | 5 +++++ README.md | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README-cn.md b/README-cn.md index 6caf512..571aaaa 100644 --- a/README-cn.md +++ b/README-cn.md @@ -3,6 +3,11 @@ ![]()
+## 翻译: + +* [English](README.md) +* [中文版](README-cn.md) + ## 什么是正则表达式? > 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子. diff --git a/README.md b/README.md index cb68020..9137d8a 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,10 @@![]()
+## Translations: -[中文版](README-zh-simple.md) +* [English](README.md) +* [中文版](README-cn.md) ## What is Regular Expression? From c1cfb1e6fe30d455b5b28bddc95562c9e60cf471 Mon Sep 17 00:00:00 2001 From: Loisaida SamDate: Fri, 11 Aug 2017 10:01:09 -0400 Subject: [PATCH 07/14] Username update (#39) As pointed out by @jdp - `\d` and `_` are a subset of `\w`. Maybe worth mentioning that most places don't allow usernames to start with a number, underscore, or dot. Even more generally speaking, these are nice toy/model illustrations, but maybe it's worth pointing out that while fun for practice, maybe regex isn't the best way to validate some of these things. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9137d8a..43b80d3 100644 --- a/README.md +++ b/README.md @@ -474,7 +474,7 @@ line. And because of `m` flag now regular expression engine matches pattern at t * *US Phone Number*: `^+?[\d\s]{3,}$` * *US Phone with code*: `^+?[\d\s]+(?[\d\s]{10,}$` * *Integers*: `^-?\d+$` -* *Username*: `^[\w\d_.]{4,16}$` +* *Username*: `^[\w.]{4,16}$` * *Alpha-numeric characters*: `^[a-zA-Z0-9]*$` * *Alpha-numeric characters with spaces*: `^[a-zA-Z0-9 ]*$` * *Password*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$` From d60813e00fdde0f00e33cfb80884308385818a1d Mon Sep 17 00:00:00 2001 From: Tibor Martini Date: Sat, 12 Aug 2017 02:41:43 +0200 Subject: [PATCH 08/14] Update README.md (#31) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 43b80d3..c4e8f02 100644 --- a/README.md +++ b/README.md @@ -173,8 +173,8 @@ zero or more spaces. ### 2.3.2 The Plus -The symbol `+` matches one or more repetitions of the preceding character. For example, the regular expression `c.+t` means: lowercase -letter `c`, followed by any number of character, followed by the lowercase character `t`. +The symbol `+` matches one or more repetitions of the preceding character. For example, the regular expression `c.+t` means: lowercase +letter `c`, followed by at least one character, followed by the lowercase character `t`. "c.+t" => The fat cat sat on the mat. From 23a0431e853d46bb0646dfbb160a447999686d43 Mon Sep 17 00:00:00 2001 From: Tibor Martini+ +[正規表現の動作確認をする](https://regex101.com/r/8Efx5G/1) + +## 5. フラグ + +フラグは修飾子とも呼ばれ、正規表現の結果を修正するために使用されます。 +フラグは任意の順序・組み合わせで使用でき、正規表現では必要不可欠な機能です。 + +|フラグ|説明 | +|:----:|------------------------------------------------------------------------| +|i |大文字・小文字を区別しない: マッチングで大文字・小文字が区別されなくなる| +|g |グローバル検索: 入力文字列の全マッチ列を検索する | +|m |複数行: 複数行をマッチさせるためのアンカー | + +### 5.1 大文字・小文字を区別しない + +修飾子 `i` は大文字・小文字を区別しなくないときに使用します。 +例えば `/The/gi` という正規表現は大文字の `T` の後に小文字の `h`, `e` が続くという意味ですが、 +最後の `i` で大文字・小文字を区別しない設定にしています。 +文字列内の全マッチ列を検索したいのでフラグ `g` も渡しています。 + +Date: Sat, 12 Aug 2017 02:46:13 +0200 Subject: [PATCH 09/14] Update email regex to match gTLDs (#32) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c4e8f02..c73218c 100644 --- a/README.md +++ b/README.md @@ -478,7 +478,7 @@ line. And because of `m` flag now regular expression engine matches pattern at t * *Alpha-numeric characters*: `^[a-zA-Z0-9]*$` * *Alpha-numeric characters with spaces*: `^[a-zA-Z0-9 ]*$` * *Password*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$` -* *email*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$` +* *email*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$` * *IPv4 address*: `^((?:(?: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]?))*$` * *Lowercase letters only*: `^([a-z])*$` * *Uppercase letters only*: `^([A-Z])*$` From fc81f7b39da2025c8c1527efa3630124f5c6aab7 Mon Sep 17 00:00:00 2001 From: Daniele Foroni Date: Sat, 12 Aug 2017 02:47:07 +0200 Subject: [PATCH 10/14] Added regex for Italian date format (#35) --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index c73218c..8d32aff 100644 --- a/README.md +++ b/README.md @@ -484,6 +484,7 @@ line. And because of `m` flag now regular expression engine matches pattern at t * *Uppercase letters only*: `^([A-Z])*$` * *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$` * *VISA credit card numbers*: `^(4[0-9]{12}(?:[0-9]{3})?)*$` +* *Date (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$` * *Date (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$` * *Date (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$` * *MasterCard credit card numbers*: `^(5[1-5][0-9]{14})*$` From e8532bf629526c91947ff6b1b946fbe667e59710 Mon Sep 17 00:00:00 2001 From: Zeeshan Ahmed Date: Sat, 12 Aug 2017 06:42:44 +0500 Subject: [PATCH 11/14] Fixes #29 grammatical mistakes --- README.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 8d32aff..1df58ac 100644 --- a/README.md +++ b/README.md @@ -16,9 +16,9 @@ A regular expression is a pattern that is matched against a subject string from mouthful, you will usually find the term abbreviated as "regex" or "regexp". Regular expression is used for replacing a text within a string, validating form, extract a substring from a string based upon a pattern match, and so much more. -Imagine you are writing an application and you want to set the rules when user choosing their username. We want the username can -contains letter, number, underscore and hyphen. We also want to limit the number of characters in username so it does not look ugly. -We use the following regular expression to validate a username: +Imagine you are writing an application and you want to set the rules for when a user chooses their username. We want to +allow the username to contain letters, numbers, underscores and hyphens. We also want to limit the number of +characters in username so it does not look ugly. We use the following regular expression to validate a username:
@@ -59,7 +59,7 @@ contains uppercase letter and also it is too short. ## 1. Basic Matchers -A regular expression is just a pattern of letters and digits that we use to perform search in a text. For example, the regular expression +A regular expression is just a pattern of characters that we use to perform search in a text. For example, the regular expression `the` means: the letter `t`, followed by the letter `h`, followed by the letter `e`.
@@ -81,7 +81,7 @@ case-sensitive so the regular expression `The` would not match the string `the`. ## 2. Meta Characters Meta characters are the building blocks of the regular expressions. Meta characters do not stand for themselves but instead are -interpreted in some special way. Some meta characters have a special meaning that are written inside the square brackets. +interpreted in some special way. Some meta characters have a special meaning and are written inside square brackets. The meta characters are as follows: |Meta character|Description| @@ -271,9 +271,10 @@ expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by l ## 2.8 Anchors -In regular expressions, to check if the matching symbol is the starting symbol or ending symbol of the input string for this purpose -we use anchors. Anchors are of two types: First type is Caret `^` that check if the matching character is the start character of the -input and the second type is Dollar `$` that checks if matching character is the last character of the input string. +In regular expressions, we use anchors to check if the matching symbol is the starting symbol or ending symbol of the +input string. Anchors are of two types: First type is Caret `^` that check if the matching character is the start +character of the input and the second type is Dollar `$` that checks if matching character is the last character of the +input string. ### 2.8.1 Caret From 250d538b3c69668029f8f5e9688c9cb803d00a94 Mon Sep 17 00:00:00 2001 From: tldzyx+ +[正規表現の動作確認をする](https://regex101.com/r/IDDARt/1) + +### 4.2 否定的な先読み + +否定的な先読みはあるパターンが後続しない全てのマッチング文字列を取得するために使用します。 +否定的な先読みは肯定的な先読みと同じように定義しますが、 `=` の代わりに +`!` を使うところが唯一の違いで、`(?!...)` と記述します。 +次の正規表現 `[T|t]he(?!\sfat)` について考えてみます。 +これはスペースを挟んで `fat` が後続することがない全ての `The` または `the` を得ることができます。 + +Date: Sat, 12 Aug 2017 15:04:46 +0800 Subject: [PATCH 12/14] Update README-cn.md (#43) --- README-cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README-cn.md b/README-cn.md index 571aaaa..483986c 100644 --- a/README-cn.md +++ b/README-cn.md @@ -93,7 +93,7 @@ |[ ]|字符种类. 匹配方括号内的任意字符.| |[^ ]|否定的字符种类. 匹配除了方括号里的任意字符| |*|匹配>=0个重复的在*号之前的字符.| -|+|匹配>1个重复的+号前的字符. +|+|匹配>=1个重复的+号前的字符. |?|标记?之前的字符为可选.| |{n,m}|匹配num个中括号之前的字符 (n <= num <= m).| |(xyz)|字符集, 匹配与 xyz 完全相等的字符串.| From 22c68687553e3ee43ce8c1bff74e5346fb14f560 Mon Sep 17 00:00:00 2001 From: Kenichiro IDA Date: Mon, 14 Aug 2017 18:42:39 +0900 Subject: [PATCH 13/14] Translate to Japanese (#46) * Translate to Japanese * Modify anchors * Fix a typo * Fix a typo --- README-ja.md | 538 +++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 1 + 2 files changed, 539 insertions(+) create mode 100644 README-ja.md diff --git a/README-ja.md b/README-ja.md new file mode 100644 index 0000000..991a46e --- /dev/null +++ b/README-ja.md @@ -0,0 +1,538 @@ +
++
+
+ +## 翻訳 + +* [English](README.md) +* [中文版](README-cn.md) +* [日本語](README-ja.md) + +## 正規表現とは + +> 正規表現とは文中からある文字列のパターンを見つけるために使用される文字列や記号の組み合わせのことです。 + +正規表現とは対象の文字列に左から右にマッチするパターンのことを言います。 +"Regular expression" (正規表現)という言葉は "regex" や "regexp" などと一言で言い表すことがあります。 +正規表現を使うことで文字列の置換・検証・抽出などを行うことが可能です。 + +アプリケーション中において、ユーザがユーザ名を決めるときに +守るべきルールを定義したいとしましょう。 +ユーザ名には文字・数字・アンダースコア・ハイフンが使用可能であるとします。 +また、ユーザ名が単調にならないように文字数にも制約を設けるものとします。 +この場合、次のような正規表現でユーザ名を検証することができます。 + +
++
+ +この正規表現によって `john_doe, jo-hn_doe, john12_as` などは許容されることになります。 +一方で `Jo` は大文字を含む上に短すぎるため許容されません。 + +## 目次 + +- [基本的な Matcher](#1-基本的な-matcher) +- [メタ文字](#2-メタ文字) + - [ピリオド](#21-ピリオド) + - [文字集合](#22-文字集合) + - [否定文字集合](#221-否定文字集合) + - [繰り返し](#23-繰り返し) + - [アスタリスク](#231-アスタリスク) + - [プラス記号](#232-プラス記号) + - [疑問符](#233-疑問符) + - [括弧](#24-括弧) + - [文字グループ](#25-文字グループ) + - [選言](#26-選言) + - [特殊文字をエスケープする](#27-特殊文字をエスケープする) + - [アンカー](#28-アンカー) + - [キャレット](#281-キャレット) + - [ドル記号](#282-ドル記号) +- [文字集合の短縮表記](#3-文字集合の短縮表記) +- [前後参照](#4-前後参照) + - [肯定的な先読み](#41-肯定的な先読み) + - [否定的な先読み](#42-否定的な先読み) + - [肯定的な後読み](#43-肯定的な後読み) + - [否定的な後読み](#44-否定的な後読み) +- [フラグ](#5-フラグ) + - [大文字・小文字を区別しない](#51-大文字・小文字を区別しない) + - [グローバル検索](#52-グローバル検索) + - [複数行](#53-複数行) +- [おまけ](#おまけ) + +## 1. 基本的な Matcher + +文中から特定の文字列を検索する時の正規表現は単なる文字の並びとして表されます。 +例えば `the` という正規表現は `t` という文字のあとに `h` が続き、さらに `e` が続くものだと +解釈されます。 + ++
+"the" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/dmRygT/1) + +`123` という正規表現は `123` という文字列にマッチします。 +正規表現は正規表現の文字列と入力文字列を1文字ずつ比較しながらマッチングを行います。 +また大文字と小文字は区別されるため、 `The` は `the` にはマッチしません。 + ++"The" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/1paXsy/1) + +## 2. メタ文字 + +メタ文字は正規表現の構成要素として使用される文字のことです。 +メタ文字はそれ自身が示す文字を表すものではなく、特別な解釈がなされます。 +一部のメタ文字は角括弧内に記述されることで特別な意味を持つものもあります。 +メタ文字には次のようなものがあります。 + +|メタ文字|説明 | +|:------:|---------------------------------------------------------------------------------------------| +|. |ピリオド。改行を除く任意の1文字にマッチ。 | +|[ ] |文字集合。角括弧内の任意の文字にマッチ。 | +|[^ ] |否定文字集合。角括弧内に含まれない任意の文字にマッチ。 | +|* |直前の文字の 0 個以上の並びにマッチ。 | +|+ |直前の文字の 1 個以上の並びにマッチ。 | +|? |直前の文字がオプションであるとみなす。 | +|{n,m} |括弧でくくる。直前の文字が n 個以上 m 個以下続く場合にマッチ。 | +|(xyz) |文字グループ。 xyz という文字列がその順に現れる場合にマッチ。 | +|| |選言。記号の前後の文字列どちらかにマッチ。 | +|\ |次に来る文字をエスケープする。予約語[ ] ( ) { } . * + ? ^ $ \ |
にマッチ。| +|^ |入力値の開始にマッチする。 | +|$ |入力値の終了にマッチする。 | + +## 2.1 ピリオド + +ピリオド `.` は最もシンプルなメタ文字の例です。 +メタ文字 `.` は任意の 1 文字にマッチします。 +キャリッジリターンと改行にはマッチしません。 +例えば `.ar` は任意の文字の後に `a` と `r` が続く文字列にマッチします。 + ++".ar" => The car parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/xc9GkU/1) + +## 2.2 文字集合 + +文字集合は文字クラスとも呼ばれます。 +文字集合を指定するには角括弧でくくります。 +文字の範囲を指定するにはハイフンを使用します。 +角括弧内の文字の記述順はマッチングには関係ありません。 +例えば `[Tt]he` という正規表現は大文字 `T` または小文字 `t` の後に `h`, `e` が続く文字列を表します。 + ++"[Tt]he" => The car parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/2ITLQ4/1) + +文字集合内でのピリオドは文字としてのピリオドを表します。 +`ar[.]` という正規表現は `a` という文字のあとに `r` が続き、さらに `.` という文字が続く文字列を表します。 + ++"ar[.]" => A garage is a good place to park a car. ++ +[正規表現の動作確認をする](https://regex101.com/r/wL3xtE/1) + +### 2.2.1 否定文字集合 + +通常キャレットは文字列の開始を意味するメタ文字ですが、角括弧内で最初に使用されると +文字集合を否定する意味を持つようになります。 +例えば `[^c]ar` という正規表現は `c` 以外の任意の文字列の後に +`a`, `r` が続く文字列を表します。 + ++"[^c]ar" => The car parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/nNNlq3/1) + +## 2.3 繰り返し + +`+`, `*`, `?` はパターンが何回続くのかを指定するためのメタ文字になります。 +これらのメタ文字は異なるシチュエーションで異なる振る舞いをします。 + +### 2.3.1 アスタリスク + +シンボル `*` は直前の文字が 0 個以上続くパターンにマッチします。 +`a*` という正規表現は小文字の `a` が 0 個以上続くことを意味します。 +しかし文字集合またはクラスの後に現れた場合はその文字集合すべてが続くことを意味します。 +例えば `[a-z]*` という正規表現は行内の任意の小文字の列を表します。 + ++"[a-z]*" => The car parked in the garage #21. ++ +[正規表現の動作確認をする](https://regex101.com/r/7m8me5/1) + +シンボル `*` はメタ文字 `.` と合わせて `.*` のように使用することで +任意の文字列を表現できます。 +またスペースを表す `\s` と併用することで空白文字を表現できます。 +例えば `\s*cat\s*` という正規表現は 0 個以上のスペースの後に +小文字の `c`, `a`, `t` が続き、その後に 0 個以上のスペースが続きます。 + ++"\s*cat\s*" => The fat cat sat on the concatenation. ++ +[正規表現の動作確認をする](https://regex101.com/r/gGrwuz/1) + +### 2.3.2 プラス記号 + +シンボル `+` は直前の文字が 1 個以上続くパターンにマッチします。 +例えば `c.+t` という正規表現は小文字の `c` の後に +任意の 1 文字が続き、さらに `t` が続くことを意味します。 + ++"c.+t" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/Dzf9Aa/1) + +### 2.3.3 疑問符 + +正規表現におけるメタ文字 `?` は直前の文字がオプションであることを意味します。 +すなわち直前の文字が 0 個または 1 個現れることを意味します。 +例えば `[T]?he` という正規表現は大文字の `T` が 0 個または 1 個出現し、 +その後に小文字の `h`, `e` が続くことを意味します。 + ++"[T]he" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/cIg9zm/1) + ++"[T]?he" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/kPpO2x/1) + +## 2.4 括弧 + +正規表現における括弧は数量子とも呼ばれますが、文字列がいくつ現れるかを示すために使用されます。 +例えば、`[0-9]{2,3}` という正規表現は 2 桁以上 3 桁以下の数字 +(0 から 9 の数字で表された文字列)にマッチします。 + ++"[0-9]{2,3}" => The number was 9.9997 but we rounded it off to 10.0. ++ +[正規表現の動作確認をする](https://regex101.com/r/juM86s/1) + +2つ目の数値は省略できます。 +例えば `[0-9]{2,}` という正規表現は 2 桁以上の数字を意味します。 +カンマも省略することができ、その場合 `[0-9]{3}` という正規表現はちょうど 3 桁の数字を意味します。 + ++"[0-9]{2,}" => The number was 9.9997 but we rounded it off to 10.0. ++ +[正規表現の動作確認をする](https://regex101.com/r/Gdy4w5/1) + ++"[0-9]{3}" => The number was 9.9997 but we rounded it off to 10.0. ++ +[正規表現の動作確認をする](https://regex101.com/r/Sivu30/1) + +## 2.5 文字グループ + +文字グループは括弧 `(...)` 内にパターンを記述してグループ分けをするために使用します。 +前述の通り、正規表現においては数量子を文字の後に置いた場合は +その直前の文字の繰り返しを意味します。しかし、文字グループの後に数量子を置いた場合は +文字グループ全体が繰り返すことを意味します。 +例えば、 `(ab)*` という正規表現は "ab" という文字列の 0 個以上の繰り返しにマッチします。 +文字グループ内では選言 `|` も使用することができます。 +例えば、`(c|g|p)ar` という正規表現は小文字の `c`, `g`, `p` のいずれかの後に +`a` が続き、さらに `r` が続くことを意味します。 + ++"(c|g|p)ar" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/tUxrBG/1) + +## 2.6 選言 + +正規表現における縦棒 `|` は選言として使用されます。 +選言は複数の正規表現からなる条件式のようなものです。 +もしかすると文字集合と選言が同じものと感じるかもしれません。 +この 2 つの大きな違いは文字集合は文字単位で評価されるのに対して選言は正規表現単位で評価されます。 +例えば `(T|t)he|car` という正規表現は大文字の `T` または小文字の `t` の後に +小文字の `h`, `e` が続くか、または小文字の `c` の後に `a`, `r` が続くことを意味します。 + ++"(T|t)he|car" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/fBXyX0/1) + +## 2.7 特殊文字をエスケープする + +バックスラッシュ `\` は正規表現内で次に来る文字をエスケープするために使用されます。 +これを使うと予約語 `{ } [ ] / \ + * . $ ^ | ?` を +記号として指定できるようになります。 +例えば `.` という正規表現は改行を除く任意の文字として使用されますが、 +`(f|c|m)at\.?` という正規表現では `.` 自体にマッチします。 +この正規表現は小文字の `f`, `c` または `m` の後に小文字の `a`, `t` が続き、 +さらに `.` が 0 個または 1 個続きます。 + ++"(f|c|m)at\.?" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/DOc5Nu/1) + +## 2.8 アンカー + +正規表現内でマッチング文字列の開始または終了であることをチェックするために +アンカーを使うことができます。 +アンカーには 2 種類あり、1 つ目が開始を表すキャレット `^`、 +2 つ目が終了を表すドル記号 `$` です。 + +### 2.8.1 キャレット + +キャレット `^` は文字列の開始かどうかを調べるために使用します。 +次の正規表現 `^a` は入力文字列 `abc` に対して(a が開始文字列なら)`a` にマッチします。 +しかし `^b` という正規表現は前の文字列に対してはどれにもマッチしません。 +"b" は `abc` という入力文字列の開始ではないからです。 +他の例を見てみます。`^(T|t)he` は大文字の `T` または小文字の `t` から始まる文字列で +その後に小文字の `h`, `e` が続くことを意味します。 + ++"(T|t)he" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/5ljjgB/1) + ++"^(T|t)he" => The car is parked in the garage. ++ +[正規表現の動作確認をする](https://regex101.com/r/jXrKne/1) + +### 2.8.2 ドル記号 + +ドル記号 `$` は文字列の終了かどうかを調べるために使用します。 +例えば `(at\.)$` という正規表現は小文字の `a` の後に +小文字の `t` が続き、最後は `.` で終わることを意味しています。 + ++"(at\.)" => The fat cat. sat. on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/y4Au4D/1) + ++"(at\.)$" => The fat cat. sat. on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/t0AkOd/1) + +## 3. 文字集合の短縮表記 + +正規表現ではよく使われる文字集合に対して短縮表記が提供されており、 +便利なショートカットとして使用できます。 +省略表記には次のようなものがあります。 + +|短縮表記|説明 | +|:------:|-----------------------------------| +|. |改行を除く任意の文字 | +|\w |英数字にマッチ: `[a-zA-Z0-9_]` | +|\W |英数字以外にマッチ: `[^\w]` | +|\d |数字にマッチ: `[0-9]` | +|\D |数字以外にマッチ: `[^\d]` | +|\s |スペースにマッチ: `[\t\n\f\r\p{Z}]`| +|\S |スペース以外にマッチ: `[^\s]` | + +## 4. 前後参照 + +しばしば前後参照とも呼ばれる先読みと後読みは **非キャプチャグループ** +(パターンのマッチングはするがマッチングリストには含まれない)という +特殊な扱いがなされる機能です。 +前後参照はあるパターンが別のあるパターンよりも先行または後続して現れることを示すために使用されます。 +例えば入力文字列 `$4.44 and $10.88` に対して `$` に続く全ての数字を取得することを考えます。 +そのためには `(?<=\$)[0-9\.]*` という正規表現を使用します。 +これは `$` に続き `.` を含む全ての数字を指すことになります。 +次のような前後参照が正規表現で使用されます。 + +|記号 |説明 | +|:----:|--------------| +|?= |肯定的な先読み| +|?! |否定的な先読み| +|?<= |肯定的な後読み| +|? +"[T|t]he(?=\sfat)" => The fat cat sat on the mat. ++"[T|t]he(?!\sfat)" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/V32Npg/1) + +### 4.3 肯定的な後読み + +肯定的な後読みは特定のパターンが先行するような文字列を得るために使用します。 +定義の仕方は `(?<=...)` とします。 +例えば `(?<=[T|t]he\s)(fat|mat)` という正規表現は +`The` または `the` の後に続く全ての `fat` または `mat` が取得できます。 + ++"(?<=[T|t]he\s)(fat|mat)" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/avH165/1) + +### 4.4 否定的な後読み + +否定的な後読みは特定のパターンが先行しない全ての文字列を得るために使用します。 +定義の仕方は `(?)` とします。 +例えば `(? +"(?<![T|t]he\s)(cat)" => The cat sat on cat. ++"The" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/dpQyf9/1) + ++"/The/gi" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/ahfiuh/1) + +### 5.2 グローバル検索 + +修飾子 `g` はグローバル検索(最初のマッチ列を検索する代わりに全マッチ列を検索する)を +行うために使用します。 +例えば `/.(at)/g` という正規表現は、改行を除く任意の文字列の後に +小文字の `a`, `t` が続きます。正規表現の最後にフラグ `g` を渡すことで +入力文字列内の全マッチ列を検索するようにしています。 + ++"/.(at)/" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/jnk6gM/1) + ++"/.(at)/g" => The fat cat sat on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/dO1nef/1) + +### 5.3 複数行 + +修飾子 `m` は複数行でマッチさせたいときに使用します。 +前述で `(^, $)` という入力文字列の開始と終了を示すためのアンカーについて説明しましたが、 +フラグ `m` は複数行でマッチさせるためのアンカーとして使用できます。 +例えば `/at(.)?$/gm` という正規表現は小文字の `a`, `t` に続き、改行を除く +任意の文字が 0 個または 1 個続くという意味ですが、 +フラグ `m` を渡すことで入力文字列の各行でパターンを検索させることができます。 + ++"/.at(.)?$/" => The fat + cat sat + on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/hoGMkP/1) + ++"/.at(.)?$/gm" => The fat + cat sat + on the mat. ++ +[正規表現の動作確認をする](https://regex101.com/r/E88WE2/1) + +## おまけ + +* *正の整数*: `^\d+$` +* *負の整数*: `^-\d+$` +* *米国の電話番号*: `^+?[\d\s]{3,}$` +* *コード付きの米国の電話番号*: `^+?[\d\s]+(?[\d\s]{10,}$` +* *整数*: `^-?\d+$` +* *ユーザ名*: `^[\w.]{4,16}$` +* *英数字*: `^[a-zA-Z0-9]*$` +* *スペース込みの英数字*: `^[a-zA-Z0-9 ]*$` +* *パスワード*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$` +* *Eメール*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})*$` +* *IPv4 アドレス*: `^((?:(?: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]?))*$` +* *小文字のみ*: `^([a-z])*$` +* *大文字のみ*: `^([A-Z])*$` +* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$` +* *VISA クレジットカード番号*: `^(4[0-9]{12}(?:[0-9]{3})?)*$` +* *日付 (DD/MM/YYYY)*: `^(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)?[0-9]{2}$` +* *日付 (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$` +* *日付 (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$` +* *MasterCard クレジットカード番号*: `^(5[1-5][0-9]{14})*$` +* *ハッシュタグ*: 前の文字列を含む (abc123#xyz456) または角括弧内にスペースを含む (#[foo bar]) : `\S*#(?:\[[^\]]+\]|\S+)` +* *@mentions*: `\B@[a-z0-9_-]+` + +## 貢献する + +* 課題を発行する +* 修正をプルリクエストする +* ドキュメントを普及させる +* 作者に直接連絡を取る: ziishaned@gmail.com または [](https://twitter.com/ziishaned) + +## ライセンス + +MIT © [Zeeshan Ahmed](mailto:ziishaned@gmail.com) diff --git a/README.md b/README.md index 1df58ac..dff4b79 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ * [English](README.md) * [中文版](README-cn.md) +* [日本語](README-ja.md) ## What is Regular Expression? From 7b76a4a726c926ee28e7d98974fa7dca9d695ce7 Mon Sep 17 00:00:00 2001 From: Piper ChesterDate: Mon, 14 Aug 2017 09:41:02 -0400 Subject: [PATCH 14/14] README: 'new line' -> 'newline' (#47) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dff4b79..5627cfa 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ The meta characters are as follows: ## 2.1 Full stop Full stop `.` is the simplest example of meta character. The meta character `.` matches any single character. It will not match return -or new line characters. For example, the regular expression `.ar` means: any character, followed by the letter `a`, followed by the +or newline characters. For example, the regular expression `.ar` means: any character, followed by the letter `a`, followed by the letter `r`. @@ -260,7 +260,7 @@ or lowercase character `c`, followed by lowercase character `a`, followed by low Backslash `\` is used in regular expression to escape the next character. This allows to to specify a symbol as a matching character including reserved characters `{ } [ ] / \ + * . $ ^ | ?`. To use a special character as a matching character prepend `\` before it. -For example, the regular expression `.` is used to match any character except new line. Now to match `.` in an input string the regular +For example, the regular expression `.` is used to match any character except newline. Now to match `.` in an input string the regular expression `(f|c|m)at\.?` means: lowercase letter `f`, `c` or `m`, followed by lowercase character `a`, followed by lowercase letter `t`, followed by optional `.` character.