- Sync language list (all translations).
- Sync some punctuation (Chinese ",.:?" -> ",。:?" and Japanese "," ->
"、").
- Sync some spacing (various translations).
- One missing translation (Chinese).
- (PR is NOT a complete audit or proofreading).
This commit is contained in:
Caleb Mazalevskis 2017-10-18 13:32:47 +08:00
parent 28f40b4f03
commit 7b00db73fc
9 changed files with 151 additions and 144 deletions

View File

@ -3,36 +3,37 @@
<img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex"> <img src="https://i.imgur.com/bYwl7Vf.png" alt="Learn Regex">
</p><br/> </p><br/>
## 翻译: ## 翻译
* [English](README.md) * [English](README.md)
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [中文版](README-cn.md) * [Português do Brasil](README-pt_BR.md)
* [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)
* [Greek](README-gr.md) * [Greek](README-gr.md)
## 什么是正则表达式? ## 什么是正则表达式
> 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子. > 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式. 一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式
"Regular expression"这个词比较拗口, 我们常使用缩写的术语"regex"或"regexp". “Regular expression”这个词比较拗口我们常使用缩写的术语“regex”或“regexp”。
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等. 正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等
想象你正在写一个应用, 然后你想设定一个用户命名的规则, 让用户名包含字符,数字,下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑. 想象你正在写一个应用,然后你想设定一个用户命名的规则,让用户名包含字符,数字,下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑。
我们使用以下正则表达式来验证一个用户名: 我们使用以下正则表达式来验证一个用户名
<br/><br/> <br/><br/>
<p align="center"> <p align="center">
<img src="./img/regexp-en.png" alt="Regular expression"> <img src="./img/regexp-en.png" alt="Regular expression">
</p> </p>
以上的正则表达式可以接受 `john_doe`, `jo-hn_doe`, `john12_as`. 以上的正则表达式可以接受 `john_doe``jo-hn_doe``john12_as`
但不匹配`Jo`, 因为它包含了大写的字母而且太短了. 但不匹配`Jo`,因为它包含了大写的字母而且太短了。
目录 目录
================= =================
@ -69,8 +70,8 @@
## 1. 基本匹配 ## 1. 基本匹配
正则表达式其实就是在执行搜索时的格式, 它由一些字母和数字组合而成. 正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。
例如: 一个正则表达式 `the`, 它表示一个规则: 由字母`t`开始,接着是`h`,再接着是`e`. 例如:一个正则表达式 `the`,它表示一个规则:由字母`t`开始,接着是`h`,再接着是`e`
<pre> <pre>
"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. "the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
@ -78,9 +79,9 @@
[在线练习](https://regex101.com/r/dmRygT/1) [在线练习](https://regex101.com/r/dmRygT/1)
正则表达式`123`匹配字符串`123`. 它逐个字符的与输入的正则表达式做比较. 正则表达式`123`匹配字符串`123`. 它逐个字符的与输入的正则表达式做比较
正则表达式是大小写敏感的, 所以`The`不会匹配`the`. 正则表达式是大小写敏感的,所以`The`不会匹配`the`
<pre> <pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -90,29 +91,29 @@
## 2. 元字符 ## 2. 元字符
正则表达式主要依赖于元字符. 正则表达式主要依赖于元字符
元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍: 元字符不代表他们本身的字面意思,他们都有特殊的含义。一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍
|元字符|描述| |元字符|描述|
|:----:|----| |:----:|----|
|.|句号匹配任意单个字符除了换行符.| |.|句号匹配任意单个字符除了换行符|
|[ ]|字符种类. 匹配方括号内的任意字符.| |[ ]|字符种类. 匹配方括号内的任意字符|
|[^ ]|否定的字符种类. 匹配除了方括号里的任意字符| |[^ ]|否定的字符种类。匹配除了方括号里的任意字符。|
|*|匹配>=0个重复的在*号之前的字符.| |*|匹配>=0个重复的在*号之前的字符|
|+|匹配>=1个重复的+号前的字符. |+|匹配>=1个重复的+号前的字符。|
|?|标记?之前的字符为可选.| |?|标记?之前的字符为可选|
|{n,m}|匹配num个大括号之前的字符 (n <= num <= m).| |{n,m}|匹配num个大括号之前的字符 (n <= num <= m)|
|(xyz)|字符集, 匹配与 xyz 完全相等的字符串.| |(xyz)|字符集,匹配与 xyz 完全相等的字符串。|
|&#124;|或运算符,匹配符号前或后的字符.| |&#124;|或运算符,匹配符号前或后的字符。|
|&#92;|转义字符,用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>| |&#92;|转义字符用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|从开始行开始匹配.| |^|从开始行开始匹配|
|$|从末端开始匹配.| |$|从末端开始匹配|
## 2.1 点运算符 `.` ## 2.1 点运算符 `.`
`.`是元字符中最简单的例子. `.`是元字符中最简单的例子
`.`匹配任意单个字符, 但不匹配换行符. `.`匹配任意单个字符,但不匹配换行符。
例如, 表达式`.ar`匹配一个任意字符后面跟着是`a``r`的字符串. 例如,表达式`.ar`匹配一个任意字符后面跟着是`a``r`的字符串。
<pre> <pre>
".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. ".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -122,11 +123,11 @@
## 2.2 字符集 ## 2.2 字符集
字符集也叫做字符类. 字符集也叫做字符类
方括号用来指定一个字符集. 方括号用来指定一个字符集
在方括号中使用连字符来指定字符集的范围. 在方括号中使用连字符来指定字符集的范围
在方括号中的字符集不关心顺序. 在方括号中的字符集不关心顺序
例如, 表达式`[Tt]he` 匹配 `the``The`. 例如,表达式`[Tt]he` 匹配 `the``The`
<pre> <pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. "[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -134,8 +135,8 @@
[在线练习](https://regex101.com/r/2ITLQ4/1) [在线练习](https://regex101.com/r/2ITLQ4/1)
方括号的句号就表示句号. 方括号的句号就表示句号
表达式 `ar[.]` 匹配 `ar.`字符串 表达式 `ar[.]` 匹配 `ar.`字符串
<pre> <pre>
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a> "ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
@ -145,8 +146,8 @@
### 2.2.1 否定字符集 ### 2.2.1 否定字符集
一般来说 `^` 表示一个字符串的开头, 但它用在一个方括号的开头的时候, 它表示这个字符集是否定的. 一般来说 `^` 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。
例如, 表达式`[^c]ar` 匹配一个后面跟着`ar`的除了`c`的任意字符. 例如,表达式`[^c]ar` 匹配一个后面跟着`ar`的除了`c`的任意字符。
<pre> <pre>
"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -156,13 +157,13 @@
## 2.3 重复次数 ## 2.3 重复次数
后面跟着元字符 `+`, `*` or `?` 的, 用来指定匹配子模式的次数. 后面跟着元字符 `+``*``?`的,用来指定匹配子模式的次数。
这些元字符在不同的情况下有着不同的意思. 这些元字符在不同的情况下有着不同的意思
### 2.3.1 `*` ### 2.3.1 `*`
`*`号匹配 在`*`之前的字符出现`大于等于0`. `*`号匹配 在`*`之前的字符出现`大于等于0`
例如, 表达式 `a*` 匹配以0或更多个a开头的字符, 因为有0个这个条件, 其实也就匹配了所有的字符. 表达式`[a-z]*` 匹配一个行中所有以小写字母开头的字符串. 例如,表达式 `a*` 匹配以0或更多个a开头的字符因为有0个这个条件其实也就匹配了所有的字符. 表达式`[a-z]*` 匹配一个行中所有以小写字母开头的字符串
<pre> <pre>
"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21. "[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21.
@ -170,8 +171,8 @@
[在线练习](https://regex101.com/r/7m8me5/1) [在线练习](https://regex101.com/r/7m8me5/1)
`*`字符和`.`字符搭配可以匹配所有的字符`.*`. `*`字符和`.`字符搭配可以匹配所有的字符`.*`
`*`和表示匹配空格的符号`\s`连起来用, 如表达式`\s*cat\s*`匹配0或更多个空格开头和0或更多个空格结尾的cat字符串. `*`和表示匹配空格的符号`\s`连起来用如表达式`\s*cat\s*`匹配0或更多个空格开头和0或更多个空格结尾的cat字符串
<pre> <pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>. "\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>.
@ -181,8 +182,8 @@
### 2.3.2 `+` ### 2.3.2 `+`
`+`号匹配`+`号之前的字符出现 >=1 次. `+`号匹配`+`号之前的字符出现 >=1 次
例如表达式`c.+t` 匹配以首字母`c`开头以`t`结尾,中间跟着任意个字符的字符串. 例如表达式`c.+t` 匹配以首字母`c`开头以`t`结尾,中间跟着任意个字符的字符串。
<pre> <pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>. "c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
@ -192,8 +193,8 @@
### 2.3.3 `?` ### 2.3.3 `?`
在正则表达式中元字符 `?` 标记在符号前面的字符为可选, 即出现 0 或 1 次. 在正则表达式中元字符 `?` 标记在符号前面的字符为可选,即出现 `0``1` 次。
例如, 表达式 `[T]?he` 匹配字符串 `he``The`. 例如,表达式 `[T]?he` 匹配字符串 `he``The`
<pre> <pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. "[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
@ -209,8 +210,8 @@
## 2.4 `{}` ## 2.4 `{}`
在正则表达式中 `{}` 是一个量词, 常用来一个或一组字符可以重复出现的次数. 在正则表达式中 `{}` 是一个量词,常用来一个或一组字符可以重复出现的次数。
例如, 表达式 `[0-9]{2,3}` 匹配最少 2 位最多 3 位 0~9 的数字. 例如,表达式 `[0-9]{2,3}` 匹配最少 2 位最多 3 位 0~9 的数字。
<pre> <pre>
"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. "[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
@ -218,11 +219,11 @@
[在线练习](https://regex101.com/r/juM86s/1) [在线练习](https://regex101.com/r/juM86s/1)
我们可以省略第二个参数. 我们可以省略第二个参数
例如, `[0-9]{2,}` 匹配至少两位 0~9 的数字. 例如 `[0-9]{2,}` 匹配至少两位 0~9 的数字。
如果逗号也省略掉则表示重复固定的次数. 如果逗号也省略掉则表示重复固定的次数
例如, `[0-9]{3}` 匹配3位数字 例如 `[0-9]{3}` 匹配3位数字。
<pre> <pre>
"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0. "[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
@ -238,9 +239,9 @@
## 2.5 `(...)` 特征标群 ## 2.5 `(...)` 特征标群
特征标群是一组写在 `(...)` 中的子模式. 例如之前说的 `{}` 是用来表示前面一个字符出现指定次数. 但如果在 `{}` 前加入特征标群则表示整个标群内的字符重复 N 次. 例如, 表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`. 特征标群是一组写在 `(...)` 中的子模式. 例如之前说的 `{}` 是用来表示前面一个字符出现指定次数. 但如果在 `{}` 前加入特征标群则表示整个标群内的字符重复 N 次. 例如,表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`
我们还可以在 `()` 中用或字符 `|` 表示或. 例如, `(c|g|p)ar` 匹配 `car``gar``par`. 我们还可以在 `()` 中用或字符 `|` 表示或。 例如, `(c|g|p)ar` 匹配 `car``gar``par`
<pre> <pre>
"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -250,9 +251,9 @@
## 2.6 `|` 或运算符 ## 2.6 `|` 或运算符
或运算符就表示或, 用作判断条件. 或运算符就表示或,用作判断条件。
例如 `(T|t)he|car` 匹配 `(T|t)he``car`. 例如 `(T|t)he|car` 匹配 `(T|t)he``car`
<pre> <pre>
"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage. "(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -262,9 +263,9 @@
## 2.7 转码特殊字符 ## 2.7 转码特殊字符
反斜线 `\` 在表达式中用于转码紧跟其后的字符. 用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符. 如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`. 反斜线 `\` 在表达式中用于转码紧跟其后的字符用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符. 如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`
例如 `.` 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?`是选择性匹配`.` 例如 `.` 是用来匹配除换行符外的所有字符的如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?`是选择性匹配`.`
<pre> <pre>
"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a> "(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a>
@ -274,15 +275,15 @@
## 2.8 锚点 ## 2.8 锚点
在正则表达式中, 想要匹配指定开头或结尾的字符串就要使用到锚点. `^` 指定开头, `$` 指定结尾. 在正则表达式中,想要匹配指定开头或结尾的字符串就要使用到锚点。 `^` 指定开头, `$` 指定结尾。
### 2.8.1 `^` ### 2.8.1 `^`
`^` 用来检查匹配的字符串是否在所匹配字符串的开头. `^` 用来检查匹配的字符串是否在所匹配字符串的开头
例如, `abc` 中使用表达式 `^a` 会得到结果 `a`. 但如果使用 `^b` 将匹配不到任何结果. 因为在字符串 `abc` 中并不是以 `b` 开头. 例如`abc` 中使用表达式 `^a` 会得到结果 `a`. 但如果使用 `^b` 将匹配不到任何结果. 因为在字符串 `abc` 中并不是以 `b` 开头
例如, `^(T|t)he` 匹配以 `The``the` 开头的字符串. 例如 `^(T|t)he` 匹配以 `The``the` 开头的字符串。
<pre> <pre>
"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage. "(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -298,9 +299,9 @@
### 2.8.2 `$` ### 2.8.2 `$`
同理于 `^`, `$` 号用来匹配字符是否是最后一个. 同理于 `^` `$` 号用来匹配字符是否是最后一个。
例如, `(at\.)$` 匹配以 `at.` 结尾的字符串. 例如 `(at\.)$` 匹配以 `at.` 结尾的字符串。
<pre> <pre>
"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a> "(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a>
@ -316,50 +317,50 @@
## 3. 简写字符集 ## 3. 简写字符集
正则表达式提供一些常用的字符集简写. 如下: 正则表达式提供一些常用的字符集简写. 如下
|简写|描述| |简写|描述|
|:----:|----| |:----:|----|
|.|除换行符外的所有字符| |.|除换行符外的所有字符|
|\w|匹配所有字母数字, 等同于 `[a-zA-Z0-9_]`| |\w|匹配所有字母数字,等同于 `[a-zA-Z0-9_]`|
|\W|匹配所有非字母数字, 即符号, 等同于: `[^\w]`| |\W|匹配所有非字母数字,即符号,等同于: `[^\w]`|
|\d|匹配数字: `[0-9]`| |\d|匹配数字: `[0-9]`|
|\D|匹配非数字: `[^\d]`| |\D|匹配非数字: `[^\d]`|
|\s|匹配所有空格字符, 等同于: `[\t\n\f\r\p{Z}]`| |\s|匹配所有空格字符,等同于: `[\t\n\f\r\p{Z}]`|
|\S|匹配所有非空格字符: `[^\s]`| |\S|匹配所有非空格字符: `[^\s]`|
|\f|匹配一个换页符| |\f|匹配一个换页符|
|\n|匹配一个换行符| |\n|匹配一个换行符|
|\r|匹配一个回车符| |\r|匹配一个回车符|
|\t|匹配一个制表符| |\t|匹配一个制表符|
|\v|匹配一个垂直制表符| |\v|匹配一个垂直制表符|
|\p|匹配 CR/LF (等同于 `\r\n`),用来匹配 DOS 行终止符| |\p|匹配 CR/LF (等同于 `\r\n`),用来匹配 DOS 行终止符|
## 4. 前后关联约束(前后预查) ## 4. 前后关联约束(前后预查)
前置约束和后置约束都属于**非捕获簇**(用于匹配不在匹配列表中的格式). 前置约束和后置约束都属于**非捕获簇**(用于匹配不在匹配列表中的格式)
前置约束用于判断所匹配的格式是否在另一个确定的格式之后. 前置约束用于判断所匹配的格式是否在另一个确定的格式之后
例如, 我们想要获得所有跟在 `$` 符号后的数字, 我们可以使用正向向后约束 `(?<=\$)[0-9\.]*`. 例如,我们想要获得所有跟在 `$` 符号后的数字,我们可以使用正向向后约束 `(?<=\$)[0-9\.]*`
这个表达式匹配 `$` 开头, 之后跟着 `0,1,2,3,4,5,6,7,8,9,.` 这些字符可以出现大于等于 0 次. 这个表达式匹配 `$` 开头,之后跟着 `0,1,2,3,4,5,6,7,8,9,.` 这些字符可以出现大于等于 0 次。
前后关联约束如下: 前后关联约束如下
|符号|描述| |符号|描述|
|:----:|----| |:----:|----|
|?=|前置约束-存在| |?=|前置约束-存在|
|?!|前置约束-排除| |?!|前置约束-排除|
|?<=|后置约束-存在| |?<=|后置约束-存在|
|?<!|后置约束-排除| |?<!|后置约束-排除|
### 4.1 `?=...` 前置约束(存在) ### 4.1 `?=...` 前置约束(存在)
`?=...` 前置约束(存在), 表示第一部分表达式必须跟在 `?=...`定义的表达式之后. `?=...` 前置约束(存在),表示第一部分表达式必须跟在 `?=...`定义的表达式之后。
返回结果只满足第一部分表达式. 返回结果只满足第一部分表达式
定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`. 定义一个前置约束(存在)要使用 `()`. 在括号内部使用一个问号和等号: `(?=...)`
前置约束的内容写在括号中的等号后面. 前置约束的内容写在括号中的等号后面
例如, 表达式 `(T|t)he(?=\sfat)` 匹配 `The``the`, 在括号中我们又定义了前置约束(存在) `(?=\sfat)` ,即 `The``the` 后面紧跟着 `(空格)fat`. 例如,表达式 `(T|t)he(?=\sfat)` 匹配 `The``the` 在括号中我们又定义了前置约束(存在) `(?=\sfat)`,即 `The``the` 后面紧跟着 `(空格)fat`
<pre> <pre>
"(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "(T|t)he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -369,10 +370,10 @@
### 4.2 `?!...` 前置约束-排除 ### 4.2 `?!...` 前置约束-排除
前置约束-排除 `?!` 用于筛选所有匹配结果, 筛选条件为 其后不跟随着定义的格式 前置约束-排除 `?!` 用于筛选所有匹配结果,筛选条件为 其后不跟随着定义的格式。
`前置约束-排除` 定义和 `前置约束(存在)` 一样, 区别就是 `=` 替换成 `!` 也就是 `(?!...)`. `前置约束-排除` 定义和 `前置约束(存在)` 一样,区别就是 `=` 替换成 `!` 也就是 `(?!...)`
表达式 `(T|t)he(?!\sfat)` 匹配 `The``the`, 且其后不跟着 `(空格)fat`. 表达式 `(T|t)he(?!\sfat)` 匹配 `The``the`,且其后不跟着 `fat`
<pre> <pre>
"(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat. "(T|t)he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
@ -382,8 +383,8 @@
### 4.3 `?<= ...` 后置约束-存在 ### 4.3 `?<= ...` 后置约束-存在
后置约束-存在 记作`(?<=...)` 用于筛选所有匹配结果, 筛选条件为 其前跟随着定义的格式. 后置约束-存在 记作`(?<=...)` 用于筛选所有匹配结果,筛选条件为 其前跟随着定义的格式。
例如, 表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat``mat`, 且其前跟着 `The``the`. 例如,表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat``mat`,且其前跟着 `The``the`
<pre> <pre>
"(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>. "(?<=(T|t)he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>.
@ -393,8 +394,8 @@
### 4.4 `?<!...` 后置约束-排除 ### 4.4 `?<!...` 后置约束-排除
后置约束-排除 记作 `(?<!...)` 用于筛选所有匹配结果, 筛选条件为 其前不跟着定义的格式. 后置约束-排除 记作 `(?<!...)` 用于筛选所有匹配结果,筛选条件为 其前不跟着定义的格式。
例如, 表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`, 且其前不跟着 `The``the`. 例如,表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`,且其前不跟着 `The``the`
<pre> <pre>
"(?&lt;!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>. "(?&lt;!(T|t)he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>.
@ -404,19 +405,19 @@
## 5. 标志 ## 5. 标志
标志也叫修饰语, 因为它可以用来修改表达式的搜索结果. 标志也叫修饰语,因为它可以用来修改表达式的搜索结果。
这些标志可以任意的组合使用, 它也是整个正则表达式的一部分. 这些标志可以任意的组合使用,它也是整个正则表达式的一部分。
|标志|描述| |标志|描述|
|:----:|----| |:----:|----|
|i|忽略大小写.| |i|忽略大小写|
|g|全局搜索.| |g|全局搜索|
|m|多行的: 锚点元字符 `^` `$` 工作范围在每行的起始.| |m|多行的: 锚点元字符 `^` `$` 工作范围在每行的起始|
### 5.1 忽略大小写 (Case Insensitive) ### 5.1 忽略大小写 (Case Insensitive)
修饰语 `i` 用于忽略大小写. 修饰语 `i` 用于忽略大小写
例如, 表达式 `/The/gi` 表示在全局搜索 `The`, 在后面的 `i` 将其条件修改为忽略大小写, 则变成搜索 `the``The`, `g` 表示全局搜索. 例如,表达式 `/The/gi` 表示在全局搜索 `The`,在后面的 `i` 将其条件修改为忽略大小写,则变成搜索 `the``The` `g` 表示全局搜索。
<pre> <pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat. "The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -432,8 +433,8 @@
### 5.2 全局搜索 (Global search) ### 5.2 全局搜索 (Global search)
修饰符 `g` 常用语执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部). 修饰符 `g` 常用语执行一个全局搜索匹配,即(不仅仅返回第一个匹配的,而是返回全部)。
例如, 表达式 `/.(at)/g` 表示搜索 任意字符(除了换行) + `at`, 并返回全部结果. 例如,表达式 `/.(at)/g` 表示搜索 任意字符(除了换行) + `at`,并返回全部结果。
<pre> <pre>
"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat. "/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat.
@ -449,11 +450,11 @@
### 5.3 多行修饰符 (Multiline) ### 5.3 多行修饰符 (Multiline)
多行修饰符 `m` 常用语执行一个多行匹配. 多行修饰符 `m` 常用语执行一个多行匹配
像之前介绍的 `(^,$)` 用于检查格式是否是在待检测字符串的开头或结尾. 但我们如果想要它在每行的开头和结尾生效, 我们需要用到多行修饰符 `m`. 像之前介绍的 `(^,$)` 用于检查格式是否是在待检测字符串的开头或结尾。但我们如果想要它在每行的开头和结尾生效,我们需要用到多行修饰符 `m`
例如, 表达式 `/at(.)?$/gm` 表示在待检测字符串每行的末尾搜索 `at`后跟一个或多个 `.` 的字符串, 并返回全部结果. 例如表达式 `/at(.)?$/gm` 表示在待检测字符串每行的末尾搜索 `at`后跟一个或多个 `.` 的字符串,并返回全部结果。
<pre> <pre>
"/.at(.)?$/" => The fat "/.at(.)?$/" => The fat

View File

@ -9,13 +9,14 @@
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [Português do Brasil](README-pt_BR.md) * [Português do Brasil](README-pt_BR.md)
* [中文版](README-cn.md) * [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)
* [Greek](README-gr.md) * [Greek](README-gr.md)
## Qué es una expresión regular? ## Qué es una expresión regular?
> Una expresión regular es un grupo de caracteres o símbolos, los cuales son usados para buscar un patrón específico dentro de un texto. > Una expresión regular es un grupo de caracteres o símbolos, los cuales son usados para buscar un patrón específico dentro de un texto.
Una expresión regular es un patrón que que se compara con una cadena de caracteres de izquierda a derecha. La palabra "expresión regular" puede también ser escrita como "Regex" o "Regexp". Las expresiones regulares se utilizan para remplazar un texto dentro de una cadena de caracteres (*string*), validar formularios, extraer una porción de una cadena de caracteres (*substring*) basado en la coincidencia de una patrón, y muchas cosas más. Una expresión regular es un patrón que que se compara con una cadena de caracteres de izquierda a derecha. La palabra "expresión regular" puede también ser escrita como "Regex" o "Regexp". Las expresiones regulares se utilizan para remplazar un texto dentro de una cadena de caracteres (*string*), validar formularios, extraer una porción de una cadena de caracteres (*substring*) basado en la coincidencia de una patrón, y muchas cosas más.

View File

@ -8,7 +8,8 @@
* [English](README.md) * [English](README.md)
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [中文版](README-cn.md) * [Português do Brasil](README-pt_BR.md)
* [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)

View File

@ -9,7 +9,7 @@
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [Português do Brasil](README-pt_BR.md) * [Português do Brasil](README-pt_BR.md)
* [中文版](README-cn.md) * [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)

View File

@ -8,7 +8,8 @@
* [English](README.md) * [English](README.md)
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [中文版](README-cn.md) * [Português do Brasil](README-pt_BR.md)
* [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)
@ -33,7 +34,7 @@
<img src="./img/regexp-en.png" alt="Regular expression"> <img src="./img/regexp-en.png" alt="Regular expression">
</p> </p>
この正規表現によって `john_doe, jo-hn_doe, john12_as` などは許容されることになります。 この正規表現によって `john_doe`、`jo-hn_doe``john12_as` などは許容されることになります。
一方で `Jo` は大文字を含む上に短すぎるため許容されません。 一方で `Jo` は大文字を含む上に短すぎるため許容されません。
## 目次 ## 目次
@ -129,7 +130,7 @@
文字集合を指定するには角括弧でくくります。 文字集合を指定するには角括弧でくくります。
文字の範囲を指定するにはハイフンを使用します。 文字の範囲を指定するにはハイフンを使用します。
角括弧内の文字の記述順はマッチングには関係ありません。 角括弧内の文字の記述順はマッチングには関係ありません。
例えば `[Tt]he` という正規表現は大文字 `T` または小文字 `t` の後に `h`, `e` が続く文字列を表します。 例えば `[Tt]he` という正規表現は大文字 `T` または小文字 `t` の後に `h` `e` が続く文字列を表します。
<pre> <pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage. "[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -151,7 +152,7 @@
通常キャレットは文字列の開始を意味するメタ文字ですが、角括弧内で最初に使用されると 通常キャレットは文字列の開始を意味するメタ文字ですが、角括弧内で最初に使用されると
文字集合を否定する意味を持つようになります。 文字集合を否定する意味を持つようになります。
例えば `[^c]ar` という正規表現は `c` 以外の任意の文字列の後に 例えば `[^c]ar` という正規表現は `c` 以外の任意の文字列の後に
`a`, `r` が続く文字列を表します。 `a``r` が続く文字列を表します。
<pre> <pre>
"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age. "[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
@ -161,7 +162,7 @@
## 2.3 繰り返し ## 2.3 繰り返し
`+`, `*`, `?` はパターンが何回続くのかを指定するためのメタ文字になります。 `+``*` `?` はパターンが何回続くのかを指定するためのメタ文字になります。
これらのメタ文字は異なるシチュエーションで異なる振る舞いをします。 これらのメタ文字は異なるシチュエーションで異なる振る舞いをします。
### 2.3.1 アスタリスク ### 2.3.1 アスタリスク
@ -181,7 +182,7 @@
任意の文字列を表現できます。 任意の文字列を表現できます。
またスペースを表す `\s` と併用することで空白文字を表現できます。 またスペースを表す `\s` と併用することで空白文字を表現できます。
例えば `\s*cat\s*` という正規表現は 0 個以上のスペースの後に 例えば `\s*cat\s*` という正規表現は 0 個以上のスペースの後に
小文字の `c`, `a`, `t` が続き、その後に 0 個以上のスペースが続きます。 小文字の `c``a` `t` が続き、その後に 0 個以上のスペースが続きます。
<pre> <pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>. "\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>.
@ -207,7 +208,7 @@
正規表現におけるメタ文字 `?` は直前の文字がオプションであることを意味します。 正規表現におけるメタ文字 `?` は直前の文字がオプションであることを意味します。
すなわち直前の文字が 0 個または 1 個現れることを意味します。 すなわち直前の文字が 0 個または 1 個現れることを意味します。
例えば `[T]?he` という正規表現は大文字の `T` が 0 個または 1 個出現し、 例えば `[T]?he` という正規表現は大文字の `T` が 0 個または 1 個出現し、
その後に小文字の `h`, `e` が続くことを意味します。 その後に小文字の `h` `e` が続くことを意味します。
<pre> <pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage. "[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
@ -258,7 +259,7 @@
文字グループ全体が繰り返すことを意味します。 文字グループ全体が繰り返すことを意味します。
例えば、 `(ab)*` という正規表現は "ab" という文字列の 0 個以上の繰り返しにマッチします。 例えば、 `(ab)*` という正規表現は "ab" という文字列の 0 個以上の繰り返しにマッチします。
文字グループ内では選言 `|` も使用することができます。 文字グループ内では選言 `|` も使用することができます。
例えば、`(c|g|p)ar` という正規表現は小文字の `c`, `g`, `p` のいずれかの後に 例えば、`(c|g|p)ar` という正規表現は小文字の `c``g` `p` のいずれかの後に
`a` が続き、さらに `r` が続くことを意味します。 `a` が続き、さらに `r` が続くことを意味します。
<pre> <pre>
@ -289,7 +290,7 @@
記号として指定できるようになります。 記号として指定できるようになります。
例えば `.` という正規表現は改行を除く任意の文字として使用されますが、 例えば `.` という正規表現は改行を除く任意の文字として使用されますが、
`(f|c|m)at\.?` という正規表現では `.` 自体にマッチします。 `(f|c|m)at\.?` という正規表現では `.` 自体にマッチします。
この正規表現は小文字の `f`, `c` または `m` の後に小文字の `a`, `t` が続き、 この正規表現は小文字の `f``c` または `m` の後に小文字の `a` `t` が続き、
さらに `.` が 0 個または 1 個続きます。 さらに `.` が 0 個または 1 個続きます。
<pre> <pre>
@ -312,7 +313,7 @@
しかし `^b` という正規表現は前の文字列に対してはどれにもマッチしません。 しかし `^b` という正規表現は前の文字列に対してはどれにもマッチしません。
"b" は `abc` という入力文字列の開始ではないからです。 "b" は `abc` という入力文字列の開始ではないからです。
他の例を見てみます。`^(T|t)he` は大文字の `T` または小文字の `t` から始まる文字列で 他の例を見てみます。`^(T|t)he` は大文字の `T` または小文字の `t` から始まる文字列で
その後に小文字の `h`, `e` が続くことを意味します。 その後に小文字の `h` `e` が続くことを意味します。
<pre> <pre>
"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage. "(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
@ -385,7 +386,7 @@
肯定的な先読みを定義するには括弧を使用します。 肯定的な先読みを定義するには括弧を使用します。
その括弧の中で疑問符と等号を合わせて `(?=...)` のようにします。 その括弧の中で疑問符と等号を合わせて `(?=...)` のようにします。
先読みのパターンは括弧の中の等号の後に記述します。 先読みのパターンは括弧の中の等号の後に記述します。
例えば `(T|t)he(?=\sfat)` という正規表現は小文字の `t` か大文字の `T` のどちらかの後に `h`, `e` が続きます。 例えば `(T|t)he(?=\sfat)` という正規表現は小文字の `t` か大文字の `T` のどちらかの後に `h` `e` が続きます。
括弧内で肯定的な先読みを定義していますが、これは `The` または `the` の後に 括弧内で肯定的な先読みを定義していますが、これは `The` または `the` の後に
`fat` が続くことを表しています。 `fat` が続くことを表しています。
@ -448,7 +449,7 @@
### 5.1 大文字・小文字を区別しない ### 5.1 大文字・小文字を区別しない
修飾子 `i` は大文字・小文字を区別したくないときに使用します。 修飾子 `i` は大文字・小文字を区別したくないときに使用します。
例えば `/The/gi` という正規表現は大文字の `T` の後に小文字の `h`, `e` が続くという意味ですが、 例えば `/The/gi` という正規表現は大文字の `T` の後に小文字の `h` `e` が続くという意味ですが、
最後の `i` で大文字・小文字を区別しない設定にしています。 最後の `i` で大文字・小文字を区別しない設定にしています。
文字列内の全マッチ列を検索したいのでフラグ `g` も渡しています。 文字列内の全マッチ列を検索したいのでフラグ `g` も渡しています。
@ -469,7 +470,7 @@
修飾子 `g` はグローバル検索(最初のマッチ列を検索する代わりに全マッチ列を検索する)を 修飾子 `g` はグローバル検索(最初のマッチ列を検索する代わりに全マッチ列を検索する)を
行うために使用します。 行うために使用します。
例えば `/.(at)/g` という正規表現は、改行を除く任意の文字列の後に 例えば `/.(at)/g` という正規表現は、改行を除く任意の文字列の後に
小文字の `a`, `t` が続きます。正規表現の最後にフラグ `g` を渡すことで、 小文字の `a` `t` が続きます。正規表現の最後にフラグ `g` を渡すことで、
最初のマッチだけではなく(これがデフォルトの動作です)、入力文字列内の全マッチ列を検索するようにしています。 最初のマッチだけではなく(これがデフォルトの動作です)、入力文字列内の全マッチ列を検索するようにしています。
<pre> <pre>
@ -489,7 +490,7 @@
修飾子 `m` は複数行でマッチさせたいときに使用します。 修飾子 `m` は複数行でマッチさせたいときに使用します。
前述で `(^, $)` という入力文字列の開始と終了を示すためのアンカーについて説明しましたが、 前述で `(^, $)` という入力文字列の開始と終了を示すためのアンカーについて説明しましたが、
フラグ `m` は複数行でマッチさせるためのアンカーとして使用できます。 フラグ `m` は複数行でマッチさせるためのアンカーとして使用できます。
例えば `/at(.)?$/gm` という正規表現は小文字の `a`, `t` に続き、改行を除く 例えば `/at(.)?$/gm` という正規表現は小文字の `a` `t` に続き、改行を除く
任意の文字が 0 個または 1 個続くという意味ですが、 任意の文字が 0 個または 1 個続くという意味ですが、
フラグ `m` を渡すことで入力文字列の各行でパターンを検索させることができます。 フラグ `m` を渡すことで入力文字列の各行でパターンを検索させることができます。

View File

@ -8,7 +8,8 @@
* [English](README.md) * [English](README.md)
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [中文版](README-cn.md) * [Português do Brasil](README-pt_BR.md)
* [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)

View File

@ -9,9 +9,10 @@
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [Português do Brasil](README-pt_BR.md) * [Português do Brasil](README-pt_BR.md)
* [中文版](README-cn.md) * [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md)
* [Greek](README-gr.md) * [Greek](README-gr.md)
## O que é uma Expressão Regular? ## O que é uma Expressão Regular?

View File

@ -8,7 +8,8 @@
* [English](README.md) * [English](README.md)
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [中文版](README-cn.md) * [Português do Brasil](README-pt_BR.md)
* [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)

View File

@ -9,7 +9,7 @@
* [Español](README-es.md) * [Español](README-es.md)
* [Français](README-fr.md) * [Français](README-fr.md)
* [Português do Brasil](README-pt_BR.md) * [Português do Brasil](README-pt_BR.md)
* [中文版](README-cn.md) * [中文(简体)版](README-cn.md)
* [日本語](README-ja.md) * [日本語](README-ja.md)
* [한국어](README-ko.md) * [한국어](README-ko.md)
* [Turkish](README-tr.md) * [Turkish](README-tr.md)