正则表达式的运作原理

简而言之,就是用来处理和识别字符的图灵机。
先弄清下面几个概念,我在计算机里输入了下面一句话:
HolidayCoffee is awesome.
这句话里,在计算机里被识别为1个字符串(重要的事情再说一遍是1个字符串,不管这句话多长还是有没有换行,从输入的开始到结束这一段都只是1个字符串)。
HolidayCoffee这个单词里的字母H在计算机里被识别为1个字符(是一个字符,没有串)。 

H这个单词,在这个字符串当中处于第一个位置(从左往右)。

按字符拆分后的顺序如下,即使是空格也算字符,也占用一个字符位(严格来说字符位第一个位置按规定应该是从0记起)。



     字符位

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

字符

H

o

l

i

d

a

y

C

o

f

f

e

e

 

i

s

 

a

w

e

s

o

m

e

.


上面是字符串的概念,下面才是正则式的概念:
不知道国内的翻译出于什么样的原因把这种表达式称做“正则表达式”,在我看来字面意思十分令人费解,我给这种表达式重新取了一个名字叫“字符律”,就像音乐当中的音律。
下面这个是一段字符律:
d\Sy
按运作原理,它应该可以识别HolidayCoffee里的day这三个字符。

 
下面正式来说一下这个字符律是怎么运作的,来看刚才这张按位拆分的字符表,很明显这样在计算机当中完全可以当成数组来存储,字符位就是键,字符就是值,程序的执行顺序从左往右对字符位进行遍历,每一次遍历都执行一次对比函数对这个字符位上的字符进行比对,是否符合上面定义的字符律“d\Sy”的条件,如果符合则返回被匹配的字符。“d”和“y”很好理解,从字面上来看他们本身就是对等的,但“\S”这个从字面上看并不与“a”匹配,但却能匹配这是为什么?请继续往下看。



     字符位

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

字符

H

o

l

i

d

a

y

C

o

f

f

e

e

 

i

s

 

a

w

e

s

o

m

e

.

字符律
     中的字符位

 

 

 

 

d

\S

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对比结果

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


“\S”这个字符律字符,属于特殊字符,具体的用法可以参照文章后面的对照表,准确的来讲这个字符对应的不是一个字符,而是对应一个字符表(这个字符表和前面看到的字符表很相似,但它的字符构成是由计算机里所有字符构成[简单理解为包含26个英文字母的表],而运算的方式依然是一对一去匹配)在这个包含全员的字符表“\S”与上表中“day”中的“a”很自然的能被匹配上(包含关系)。

上面这一段是对单个字符进行匹配的情况,下面说一下整体的批评结果,在上面这段字符律中如果出现“eay”这样的单词的话是不能完全匹配的,因为单词“e”不符合“d”这个约定,在字符律这一段中只要有任何一位不匹配,这个式子的匹配结果都不会返回(即不匹配)。 


匹配关系与运行的顺序如下表:


     字符位

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

输出

字符

H

o

l

i

d

a

y

C

o

f

f

e

e

 

i

s

 

a

w

e

s

o

m

e

.

 

顺序1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

顺序2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

顺序3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

顺序4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

顺序5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

d

\S

y

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

从上表可以理解为执行到“顺序5”才返回出了匹配结果(这里只是为了说明,真实情况中这个匹配会从整个字符串最开始执行到最后,中间如果同样出现了匹配情况,也会返回结果)。

字符律的固定位表达式的方法基本能说明清楚正则表达式是如何运作的,而正则的优势在于形成不固定长度的表达式(使用+、*、?等特殊符号)对隐含有一定规律的字符串进行解析识别,这个特点使得正则广泛应用于各种编译器、解析器的语法检查当中,协助编程人员在编译前提前发现程序错误。


特殊字符&字符组合对照表(以下特殊字符即使有多个字符输入,但均对应字符串里一个字符位!)

5c78d14b9c671


写在后面的:

正则使用必要的训练是不可少的,这就像是新学一门编程语言一样。因此必要的练习工具、参考资料还是要准备好的,想在其他语言(大部分编程语言都有正则函数)当中使用正则式(字符律),是需要在正则测试环境中对测试文本进行表达式的试验。
顺便说下,网上有很多在线正则式的工具。

 

 

 

访客评论

暂无评论
发表评论
当前字数:0
评论内容限制在250字以内,提交后经管理员审核后发布。
提交评论