C#词法分析器(三)正则表达式

正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以非常高效的描述处理词法单元时要用到的模式类型。
一、正则表达式的定义

正则表达式可以由较小的正则表达式按照规则递归地构建。每个正则表达式 r 表示一个语言 L(r),而语言可以认为是一个字符串的集合。正则表达式有以下两个基本要素:

是一个正则表达式, L()=,即该语言只包含空串(长度为 0 的字符串)。

如果 a 是一个字符,那么 a 是一个正则表达式,并且 L(a)={a},即该语言只包含一个长度为 1 的字符串 a。

由小的正则表达式构造较大的正则表达式的步骤有以下四个部分。假定 r 和 s 都是正则表达式,分别表示语言 L(r) 和 L(s),那么:

(r)|(s) 是一个正则表达式,表示语言 L(r)∪L(s),即属于 L(r) 的字符串和属于 L(s) 的字符串的集合( L(r)∪L(s)={s|s∈L(r) or s∈L(s)})。

(r)(s) 是一个正则表达式,表示语言 L(r)L(s),即从 L(r) 中任取一个字符串,再从 L(s) 中任取一个字符串,然后将它们连接后得到的所有字符串的集合( L(r)L(s)={st|s∈L(r) and t∈L(s)})。

(r) 是一个正则表达式,表示语言 L(r),即将 L(r) 连接 0 次或多次后得到的语言。

(r) 是一个正则表达式,表示语言 L(r)。

上面这些规则都是由 Kleene 在 20 世纪 50 年代提出的,在之后有出现了很多针对正则表达式的扩展,他们被用来增强正则表达式表述字符串模式的能力。这里采用是类似 Flex 的正则表达式扩展,风格则类似于 .Net 内置的正则表达式:

时间: 2024-09-19 09:08:38

C#词法分析器(三)正则表达式的相关文章

JAVA之旅(三十四)——自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫

JAVA之旅(三十四)--自定义服务端,URLConnection,正则表达式特点,匹配,切割,替换,获取,网页爬虫 我们接着来说网络编程,TCP 一.自定义服务端 我们直接写一个服务端,让本机去连接,可以看到什么样的效果 package com.lgl.socket; import java.io.IOException; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; publ

分号-求助分割 , 正则表达式

问题描述 求助分割 , 正则表达式 例如 小网,小菜,小王,小二,小三 以 , 分割开来 得到 小网 小菜 小王 小二 小三 正则表达式怎么写阿 ! help 直接split函数 可以但是我不需要他, 程序通过正则获取到 这些人姓名,然后用不同的颜色区分, 只需要 而且只能用正则表达式来获取.不需要去用 split来一一获取 解决方案 直接split函数,不是比正则效率高很多? 解决方案二: String s = "小网,小菜,小王,小二,小三"; String arr[] = s.s

JS经典正则表达式笔试题汇总_javascript技巧

本文实例总结了JS经典正则表达式笔试题.分享给大家供大家参考,具体如下: 一.复习字符串的传统操作 如何获取一个字符串中的数字字符,并按数组形式输出,如 dgfhfgh254bhku289fgdhdy675gfh 输出[254,289,675] 分析:循环用charAt()的方法获取到每一个子字符串,判断他是不是在0~9之间,是就把他扔到准备好的数组里 var str="dgfhfgh254bhku289fgdhdy675gfh"; findNum(str); function fin

linux shell命令常用技巧

Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做.如果你需要的是命令的退出状态,而非它的输出,此功能会非常有用,见如下Shell代码:  代码如下 复制代码     /> vi test_dev_null.sh         #!/bin/bash     if grep hello TestFile

JS 清除字符串数组中,重复元素的实现方法_javascript技巧

JS 清除字符串数组中,重复元素的实现方法 <script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<1000; i++) { arrData[arrData.length] = String.fromCharCode(Math.floor(Math.random()*26)+97); } //document.write(arrData+"<br/&g

jQuery 表单验证扩展(五)

大概在一个月之前,自己尝试着写一个jQuery的表单验证插件,当初的目的并不是为了让这个插件流行起来,只是为了自己学习的需要.由于工作的问题,这个问题一直处于停留的状态.前些天报名参加了那个什么博客大赛,最近未写一篇博客,当然本文也不是了参加什么博客大赛而写,只是作为自己学习的积累.今天抽空重新整理了一下插件中的正则表达式的验证,在此分享一下.希望大家多多指教   文章回顾: jQuery 表单验证扩展(一)  jQuery 表单验证扩展(二)  jQuery 表单验证扩展(三)  jQuery

Linux Shell常用技巧(一)

一.    特殊文件: /dev/null和/dev/tty     Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty.其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做.如果你需要的是命令的退出状态,而非它的输出,此功能会非常有用,见如下Shell代码:    /> vi test_dev_null.sh        #!/bin/bash    if

Linux Shell常用技巧(目录)

以上关于shell的总结,全部转载至下面的博客..Linux Shell常用技巧(一) http://www.cnblogs.com/stephen-liu74/archive/2011/11/10/2240461.html一. 特殊文件: /dev/null和/dev/tty二. 简单的命令跟踪三. 正则表达式基本语法描述四. 使用cut命令选定字段五. 计算行数.字数以及字符数六. 提取开头或结尾数行 Linux Shell常用技巧(二) http://www.cnblogs.com/ste

Java正则表达式(三)、代码量统计工具(统计java源文件中注释、代码、空白行数量)

       比如想统计一个Java程序员一天写代码的工作量(如:有效代码多少行.空行多少.注释多少行等),这个小工具也许能做为一个参考的依据.     思路:因为每个java源文件的内容基本包括java语句.空白行.注释三部份组成(不包括注解),所以要统计某个文件这三部份的内容各占多少时,只需写三个匹配这几部份内容的正则表达式即可.然后通过IO流读取文件中的每一行,并根据正则匹配的结果,累加每部份匹配的数量即可.     注释行:单行注释(//).多行注释.文档注释.正则:((//)|(/\\