正则表达式与运算

2、正则表达式

我们现在需要寻找一种可以描述记号类型的工具,在此之前我们首先研究一下常见的记号的结构。为了表示出具有某种共性的字符串的集合,我们需要书写出一些能代表字符串集合的规则。这个集合中的所有成员都将被认为是一种特定类型的记号。

首先,规则可以把一个特定的字符或者是空字符串认为是一种类型的记号的全部。上文所说到的四则运算式子的例子,“左括号”这种类型的记号就仅仅对应着字符”(“,其他的字符或者字符串都不可能是“左括号”这个类型的记号。

其次,规则可以进行串联。串联的意思是这样的,我们可以让一个字符串的前缀符合某一个指定的规则,剩下的部分的前缀符合第二个规则,剩下的部分的前缀符合第三个规则等等,一直到最后一个部分的全部要符合最后一个规则。如果我们把”function”这个字符串作为一个记号类型来处理的话,我们可以把”function”这个字符串替换成8个串联的规则:”f”,”u”,”n”,”c”,”t”,”i”,”o”,”n”。首先,字符串”function”的前缀”f”符合规则”f”,剩下的部分”unction”的前缀”u”符合规则”u”,等等,一直到最后一个部分”n”的全部符合规则”n”。

第三,规则可以进行并联。并联的意思就是,如果一个字符串符合一系列规则中的其中一个的话,我们就说这个字符串符合这一些规则的并联。于是这些规则的并联就构成了一个新的规则。一个典型的例子就是判断一个字符串是否关键字。关键字可以是”if”,可以是”else”,可以是”while”等等。当然,一个关键字是不可能同时符合这些规则的,不过只要一个字符串符合这些规则的其中一个的话,我们就说这个字符串是关键字。于是,关键字这个规则就是”if”、”else”、”while”等规则的并联。

第四,一个规则可以是可选的。可选的规则实际上是属于并联的一种特殊形式。加入我们需要规则”abc”和”abcde”并联,我们会发现这两个规则有着相同的前缀”abc”,而且这个前缀恰好就是其中的一个规则。于是我们可以把规则改写成”abc”与””和”de”的并联的串联。但是规则””指定的规则是空串,因此这个规则与”de”的并联就可以看成是一个可选的规则”de”。

第五,规则可以被重复。有限次的重复可以使用串联表示,但是如果我们不想限制重复的次数的话,串联就没法表示这个规则了,于是我们引入了“重复”。一个典型的例子就是程序设计语言的标识符。标识符可以是一个变量的名字或者是其他东西。一门语言通常没有规定变量名的最大长度。因此为了表示这个规则,就需要将52个字母进行并联,然后对这个规则进行重复。

上述的5种构造规则的方法中,后面的4个方法被用于把规则组合成为更大的规则。为了给出这种规则的形式化表示,我们引入了一种范式。这种范式有以下语法:

1:字符用双引号包围起来,空串使用ε代替。

2:两个规则头尾连接代表规则的串联。

3:两个规则使用 | 隔开代表规则的并联。

4:规则使用[]包围代表该规则是可选的,规则使用{}包围代表该规则是重复的。

5:规则使用()包围代表该规则是一个整体,通常用于改变操作符 | 的优先级。

举个例子,一个实数的规则书写如下:

{“0”|”1”|”2”|”3”|”4”|”5”|”6”|”7”|”8”|”9”}”.”[{“0”|”1”|”2”|”3”|”4”|”5”|”6”|”7”|”8”|”9”}]。

但是,我们如何表示“不是数字的其他字符呢”?字符的数量是有限的,因此我们可以使用规则的并联来表示。但是所有的字符实在是太多(ASCII字符集有127个字符,UTF-16字符集有65535个字符),因此后来人们想出了各种各样的简化规则书写的办法。比较著名的有BNF范式。BNF范式经常被用于理论研究,但是更加实用的是正则表达式。

正则表达式的字符不需要用双引号括起来,但是如果需要表示一些被定义了的字符(如 “|” )的话,就使用转义字符的方法表示(如 “/|”)。其次,X?代表[X],X+代表{X},X*代表[{X}]。字符集合可以用区间来表示,[0-9]可以表示“0”|”1”|”2”|”3”|”4”|”5”|”6”|”7”|”8”|”9”,[^0-9]则表示“除了数字以外的其他字符”。正则表达式还有各种各样的其他规则来简化我们的书写,不过由于本文并不是“精通正则表达式”,因此我们只保留若干比较本质的操作来进行词法分析原理的描述。

正则表达式的表达能力极强,小数的规则可以使用[0-9]+.[0-9]来表示,C语言的注释可以表示为//*([^/*]|/*+[^/*/])*/*+/来表示。

转载于:https://www.cnblogs.com/feng9exe/p/7919359.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值