Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@

#### 2018.11.16 第6次

1组:193
1组:193 [193-有效的电话号码](details/193-有效的电话号码.md)

2组:537

Expand Down
73 changes: 73 additions & 0 deletions details/193-有效的电话号码.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# 193有效的电话号码

需要使用bash脚本完成这道题目 匹配字符优先想到正则匹配

- linux下的正则匹配 grep 命令正则匹配[文档](https://www.gnu.org/software/grep/manual/grep.html)

```sh
grep --perl-regexp '^(\d{3}-|\(\d{3}\) )\d{3}-\d{4}$' file.txt
```

[wiki正则](https://zh.wikipedia.org/wiki/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F)

分析这个正则表达式 grep(Global Regular Expression Print) 后面的命令表示了 正则的环境 使用了扩展正则的表达式模式 这次正则使用的是perl 环境下的语言

固定检索内容的位置

$表示匹配已XXX结尾的表达 ^表示匹配头

- 命令解释 \d 表示 [0-9]

扩展:

\w == [a-zA-Z]
\w == [^a-zA-Z]
\s == [ \t\r\n\f]
\S == [^ \t\r\n\f]
\D == [^1-9]
\< 表示一个单词的起始
\> 表示一个单词的结尾

- {3} 表示出现三次数字

> {N}匹配前一个字符N次。
> {N,}匹配前一个字符≥N次。
> {N,M}匹配前一个字符 N 到 M次。

- | 表示或语法

## 正则发展史

- 诞生期

1. 20世纪40年代的两个神经物理学家Warren McCulloch与Walter Pitts,他们将神经系统中的神经元描述成小而简单的自动控制元
2. 数学家 Stephen Kleene 1950 声明了 regular expressions就
3. 1968 Ken Thompson 发表论文 (Regular Expression Search Algorithm) 实现qed,qed是unix上编辑器ed的前身。ed有一个命令可以展示文本中符合给定正则表达式的行,这个命令是g/Regular Expression/p,在英文中读作“Global Regular Expression Print”,由于这个命令非常实用,所以后来有了grep、egrep这两个命令

- 成长期

相比egrep,grep只支持很少的元符号,*是支持的(但不能用于分组中),但是+、|与?是不支持的;而且,分组时需要加上反斜线转义,像\\( ...\\)这样才行,由于grep的缺陷性日渐明显,AT&T的Alfred Aho实在受不了了,于是egrep诞生了,这里的e表示extended,加强版的意思,支持了+、|与?这三个元符号,并且可以在分组中使用*,分组可以直接写成(...),同时用\1,\2...来引用分组

- 成熟期

这种混乱度情况一直持续到了1986年。在1986年,POSIX(Portable Operating System Interface)标准公诸于世,POSIX制定了不同的操作系统都需要遵守的一套规则,当然,正则表达式也包括其中。

当然,除了POSIX标准外,还有一个Perl分支,也就是我们现在熟知的PCRE,随着Perl语言的发展,Perl语言中的正则表达式功能越来越强悍,为了把Perl语言中正则的功能移植到其他语言中,PCRE就诞生了。现在的编程语言中的正则表达式,大部分都属于PCRE这个分支

1.POSIX标准

POSIX把正则表达式分为两种(favor):BRE(Basic Regular Expressions)与ERE(Extended Regular Expressions )

使用BRE语法的命令有:grep、ed、sed、vim 使用ERE语法的命令有:egrep、awk、emacs

POSIX还定义了一些shorthand 比如 [:alnum:] == [0-9]

2.PCRE标准

Perl语言第一版是由Larry Wall发布于1987年12月

随着Perl的不断发展,其支持的正则表达式的功能也越来越强大。其中影响较大的是于1994年10月发布的Perl 5,其增加了很多特性,比如non-capturing parentheses、lazy quantifiers、look-ahead、元符号\G等等

正好这时也是WWW兴起的时候,而Perl就是为了文本处理而发明的,所以Perl基本上成了web开发的首选语言。Perl语言应用是如此广泛,以至于其他语言开始移植Perl,最终Perl compatible(兼容)的PCRE诞生了,这其中包括了Tcl, Python, Microsoft’s .NET , Ruby, PHP, C/C++, Java等等

shorthand在POSIX与PCRE是不同的,PCRE中我们常用的有如下这些