正则表达式的应用研究

2024-07-25

正则表达式的应用研究(精选9篇)

正则表达式的应用研究 第1篇

正则表达式本质上来说是某种遵循一定规则的表达式,同时也可以认为是一种程序语言,这种语言能对文字进行较为模糊的匹配。具体来说就是,正则表达式可以用某些特殊符号代表一组字符和指定对其匹配的次数,当然,前提是这种字符必须具有某种特征,此时,具有这些特殊符号的文本就不再用以表示特定文本的内容了,反而是变成了文本模式,这种文本模式就可以对所有符合此模式的一切文本串进行匹配。

2正则表达式的应用背景与意义

随着计算机网络的发展,网络已经成为了人们获取信息的重要手段,并且更好地实现了资源与信息的共享,然而网络信息仍然有很多不足,如存在很多诸如数据语义信息不清晰、模式等不明确、表现形式单一、信息利用率较为低下的问题,而这些问题都可以通过应用正则表达式来解决。正则表达式本身就是一种程序语言,能对文字进行较为模糊的匹配,通过对文字的匹配提取等,网络信息的抽取也能变得容易起来。根据定制的模板,从文本中把特定的信息抽取出来,使这些数据相对结构化,并且还要分析和整理这些信息内容,以上操作即为信息抽取的过程。这种信息抽取的作用类似于信息检索,但其比信息检索更为前沿和新颖,近几年已经成为了研究网络信息处理的热点问题,而正则表达式,在抽取信息、搜集数据等各个方面都发挥着重要的作用,基于其是对一类字符串进行共性描述的规则,它更是一种处理字符串并且寻找特定字符串必不可少的工具。

3正则表达式的分类

(1)以功能为标准进行区分:可分为基本正则表达式与扩展正则表达式。前者包含于后者之中。

(2)以实现方式为标准区分:基于确定型有穷自动机引擎和基于非确定型有穷自动机引擎,这两种实现方式有理论上的区别,因此在应用范围上也有很大的不用。

(3)以对逻辑结构的描述的精确度区分:用于校验检测的,需要完全精确地对字符串进行描述的类型,和用于数据提取的,需要描述的精确度不高的类型。

4正则表达式的应用

4.1应用于通过文本解决实际问题

正则表达式是美国数学家Stephen Kleene提出的,可以通过提取、替换文本子字符串的方式来快速分析大量的文本并且能找到特定的某种字符模式的一种程序。其最开始的主要作用是用来对正则集代数进行描述。后来也应用于实用Ken Thompson的计算搜索上的某些研究探讨上。当前正则表达式的应用已不单单局限于字符层面的处理了,而是能够应用于各个领域了,尤其是在解决实际问题方面,作用更加突出,比如可以用来对数据的有效性合法性进行验证等,目前最普遍的是在对用户密码、电话号码等身份验证等方面发挥作用。总之,大多数与文本关系密切的问题,如果应用正则表达式这种方法来加以解决,都会是更高效的,并且相对于其他方法来说,也会显得更加简洁。

4.2应用于内容格式的显示

现在多数信息在信息库中都是以html的形式存储的,并且前台内容也会因后台管理上对各板块排版格式的变化而各有不同,更重要的是即使改版页面,也不能完全修改数据库中的html的格式。要解决这一问题,正则表达式就派上了用场。我们完全可以用正则表达式这一方法将以已读取的html代码换种形式,即替换为格式控制代码,进而控制html的显示。

4.3应用于信息的抽取

近几年来,计算机发展十分迅速,随之而来的便是信息爆炸和大量电子文档的泛滥,寻找一种能在大量的信息中抽取能满足不同人需求的信息的技术方法,也就成为了时代的要求,而正则表达式在这种需求中也就应运而生了,顾名思义,从文本中抽取信息即为信息抽取。

(1)web新闻网页中的信息用正则表达式来提取。信息网页具有很多其他媒体不具备的特点,包括时效性强,信息量大、结构较为稳定等各个特点,因此它的应用率更高,尤其是新闻网页,只要是符合条件的新闻纪录,都会在它的检索条件内,其作用相当于是充当了“索引”的角色,对于这一庞大的信息网,也就更适合采用正则表达式的方式来进行信息提取,若是采用其他手段,则不会如此快速高效的实现信息的提取利用。

(2)文本文档中的信息用正则表达式来抽取。对于一些以文本格式存储的电子文档,如果能实现这些非结构化的文本格式向半结构化的格式的转变,那么势必会有利于人们实现资源的充分利用,并且能最大程度上提高资源的利用效率。为了实现这一目的,正则表达式的利用是必不可少的。

5结语

正则表达式是一种由普通字符和元字符构成的特殊的字符串,应用此技术可以在数据提取、验证其格式的有效性等各方面展开工作,提高其效率及时效性,因此具有很大的实际应用价值,以上提出的关于正则表达式的几项应用,希望能对从事这些工作的人有所帮助。

摘要:正则表达式本质上来说是一项规则,而这种规则主要用来对一类字符串的共性进行描述,正则表达式的发展,已形成了一种从字符的集合中来寻找某个指定的字符串的程序工具。它具有既简洁又结构化的优点,近年来,正则表达式已经从一个模糊的数概念,发展成了一项重要的,在各个领域都有重大作用,能解决很多实际问题的计算机功能,本文主要讲述了正则表达式的概念,意义及实际应用等问题,希望能有助于人们对正则表达有更客观的认识,并加深对它的研究。

关键词:正则表达式,概念,背景与意义,应用

参考文献

[1]余晟(译),(美)Jeffrey E.F.Friedl著.精通正则表达式.第3版.北京:电子工业出版社,2007.

[2]李铭(译),(美)Christian Nagel,Bill Evjen,Jay Glynn著,C#2005&.NET3.0高级编程.第5版.北京:清华大学出版社,2007.

[3]王珊,陈红.数据库系统原理教程.北京:清华大学出版社,2000.

正则表达式的应用研究 第2篇

package regex;

import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class RegexTest {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

System.out.println(“Enter pattern:”);

String patternString = in.nextLine;

Pattern pattern = Pattern.compile(patternString);

while(true){

System.out.println(“Enter String to match: ”);

String input = in.nextLine();

if(input == null || input.equals(“”))

return;

Matcher matcher = pattern.matcher(input);

if(matcher.matches()){

System.out.println(“Match”);

int g = matcher.groupCount();

if(g >0){

for(int i = 0; i< input.length(); i++){

for(int j = 1; j<= g; j++){

if(i == matcher.start(j) && i == matcher.end(j)){

System.out.println(“()”);

}

}

for(int j = 1; j<= g; j++){

if(i == matcher.start(j) && i != matcher.end(j)){

System.out.println(‘(‘);

}

}

System.out.println(input.charAt(i));

for(int j = 1; j<= g; j++){

if(i + 1 != matcher.start(j) && i + 1 == matcher.end(j)){

System.out.println(‘)‘);

}

}

}

System.out.println();

}

}

else

System.out.println(“No match”);

}

}

正则表达式的应用研究 第3篇

1 正则表达式概述

正则表达式是种特殊字符串,由普通字符(原义字符)和特殊字符(元字符)组成,能按照特定语法规则被解释成多种字符串,并以此对目标字符串进行匹配[1]。在实际应用中,正则表达式可以让用户通过使用一系列特殊字符构建匹配模式,然后把匹配模式与目标对象进行比较,根据比较对象中是否包含匹配模式,以执行相应处理操作[2]。由于正则表达式字符处理能力强大、灵活高效、适应性强,因此广泛用于字符串校验和分析。

当前,大多数编程语言和工具都包含对正则表达式的支持。C#对正则表达式的支持是通过.NET基础类库中System Text.RegularExpressions名称空间和该名称空间中一系列可以充分发挥正则表达式功能的类来实现。

2 正则表达式在医院信息系统中的应用

2.1 校验数据格式,提高数据质量

校验数据格式是正则表达式的一项最常用功能。正则表达式是一种形式化的字符串表示描述方法,只需很少的代码即可描述出应用遇到的任意字符串模式。如果遇到的字符串与正则表达式不符,说明数据格式不正确[3]。

医院信息系统收集的数据主要有三类:病人信息、财务管理数据、医疗数据。这些数据的质量关系到医疗安全和费用准确。而医院经常要面对较大的人流压力,工作人员在使用信息系统录入资料时,难免会输入错误。如果在数据保存时不进行验证,将会导致两种问题:(1)数据错误。比如在姓名信息里输入了不该有的数字键等;(2)系统错误。输入一些非恶意、但与数据库数据类型不符的数据,造成系统无法处理,就会出现错误提示。例如数值型字段中输入了字母,造成保存失败等,将会影响最终用户的使用。

身份证号码是患者身份的标识,在病历合并、随访追踪、传染病上报等方面起着重要作用。因此录入患者资料时,保证身份证号码的准确性有重要意义。而身份证号码位数多,在人流压力大的情况下,极容易输错。下面以身份证格式验证来说明正则表达式在医院信息系统中的应用:(1)身份证号码格式验证的内容。身份证号码的长度为15位或18位,18位身份证号码的最后一位是数字或"X";身份证里包含了出生年月和籍贯信息[4]。因此身份证验证的内容包括:位数验证、格式验证、出生年月验证、地区编码验证。为了简单起见,这里只做位数和格式验证;(2)利用C#语言实现验证:

2.2 防止SQL注入,提高系统安全性

结构化查询语言(SQL)是一种用来和数据库交互的文本语言。SQL Injection就是利用某些数据库的外部接口把用户数据插入到实际的数据库操作语言(SQL)当中,从而达到入侵数据库乃至操作系统的目的。它的产生主要是由于程序对用户输入的数据没有进行严格的过滤,导致非法数据库查询语句的执行[5]。如果在医院信息系统中没有对用户输入的数据进行SQL注入检测,将会产生如下问题:(1)用户可能利用漏洞对系统攻击(2)对于无意中输入的SQL关键字,将会造成SQL语句执行失败。例如医嘱备注信息中经常用"'"代替分钟,这将引起保存失败,导致用户的不满。

目前,比较流行的做法是对用户提交的数据应用正则表达式进行严格的检测和过滤。主要方法有两种:(1)对于有固定格式的输入,宜构造该格式的正则表达式进行严格验证;(2)对于没有固定输入格式的输入,可用根据SQL关键字归纳非法字符集合,构造正则表达式给予过滤。值得注意的是医院信息系统中的数据关系到医疗安全,因此在引入正则表达式时要注意不能使用过滤和替换,只能对不匹配或含有特殊字符的数据进行提示。例如可以构造如下的非法字符集来防止部分SQL注入:

2.3 利用正则表达式实现模式识别,提高系统可用性

医疗信息中存在很多复杂的模式,如果能够有效的识别和利用这些模式,将会提高信息系统的智能化水平,进而提高系统的可用性。电子化疗方案书的实现是利用正则表达式实现模式识别,提高系统可用性的一个案例。

一个化疗方案通常由几组严格按照时间顺序执行的药物构成,其电子化的难点在于注射日期的无规律性和不连续性引起的输入困难。表1是常规的化疗方案,如果在输入日期时采用传统的输入方法,即为每组药输入一个注射日期,则输入次数为:

N=∑I(d)=1+4+3+5+1+2+2=18,其中I为药物组合序号,d为该组药的注射日期。

上述方法除了增加医生的输入工作量之外,也会将表一所示的化疗方案转换为15组药物记录。这样做既不符合医生的书写习惯,也使整个化疗方案变得复杂难懂。

如果指定了开始日期,系统能够识别类似于D1,2和D1-5这样的表达式,进而自动生成注射日期,就可以解决上述问题。利用这种方法既符合医生习惯,也大大降低了医生的输入量。例如对表1的化疗方案,每组药按医生习惯的模式输入注射日期(输入类似D1,2,D1-5的表达式),输入次数减少了N(注射次数)倍,对于整组方案来说总输入次数为7,输入量减少了2.57倍。

分析注射日期的表达式,共有三种模式:(1)逗号分隔表达式,例如D1,2,3表示化疗的第一,第二,第三天,共使用三次;(2)"-"分隔表达式,例如D1-5表示化疗的第一到第五天,共注射5次;(3)混合表达式,例如D1-5,D8表示化疗的第一至第五天,以及第八天,共注射6次。因此,可以构造正则表达式来校验注射日期的输入格式,并利用C#的MatchCollection类捕获匹配的结果,进而自动计算出每组药的注射日期。

2.4 利用正则表达式提高查询能力,降低查询语句的复杂度

当前,各种主流数据库都提供了应用正则表达式的方法。例如Oracle 8和Oracle 9i中缺乏灵活性的SQL正则表达式最终在Oracle 10g中得到了解决。Oracle 10g内建了符合POSIX标准的正则表达式,提供了四个新函数:REG-EXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和REG-EXP_REPLACE。它们在用法上与Oracle SQL函数LIKE、INSTR、SUBSTR和REPLAC相似,但是它们使用POSIX正则表达式代替了老的百分号(%)和通配符(_)字符,使文本匹配能力显著增加。

电子病历是医院信息系统的一个组成部分。电子病历数据中包含大量结构化和非结构化的文本信息,有效的利用这些信息至关重要。如果采用标准SQL语句对这类文本数据进行查询分析,不仅查询语句复杂难写,而且有可能降低数据库的查询速度,一旦出错还难以排查和修改。正则表达式可以让用户通过使用一系列的特定字符构建查询模式,其强大的模式匹配功能可以简化繁琐的SQL查询语句的编写工作[6]。灵活运用正则表达式的模式匹配功能,用简洁的公式实现复杂文本模式的表达,有助于提高医院信息系统中文本数据的查询和分析能力。

例如,对于这样一个简单的查询:获取体征表里满足"体征描述字段内容包含肝肿大、肝脏肿大、肾肿大、肾脏肿大、脾肿大、脾脏肿大之一"的记录,其标准SQL语句如下:

Select*from table1 where Symptom like'%肝肿大%'or Symptom like'%肝脏肿大%'or Symptom like'%s肾肿大%'or Symptom like'%s肾脏肿大%'or Symptom like'%脾肿大%'or Symptom like'%s脾脏肿大%';

如果用正则表达式,其SQL语句如下:

Select*from table1 where REGEXP_LIKE(Symptom,'(肝|肝脏|肾|肾脏|脾|脾脏)肿大');

3 讨论

正则表达式具有简洁、通用、速度快的优点,被广泛应用于数据格式验证、文本数据解析等方面。医院信息系统每天都要产生大量业务数据,其数据质量和安全性非常重要。利用正则表达式的模式匹配能力在源头验证数据有效性,是提高数据质量和系统安全性的一种重要方法;利用正则表达式的模式识别能力解析用户输入,提高医院信息系统智能化水平,值得借鉴和思考;另外,正则表达式也对医院信息系统中大量非格式化文本的分析和利用提供了思路。

参考文献

[1]刘小波,谢芊,李留英.应用正则表达式在ASP.NET中实现优化的输入验证方法[J].现代图书情报技术,2005,(10):80-83.

[2]叶文晖,梁里宁.在ASP.NET中利用正则表达式实现模式验证[J].电脑知识与技术,2005,(24):27-28.

[3]杜冬梅,许彩欣,苏健.浅谈正则表达式在web系统中的应用.计算机系统应用,2007.8.

[4]中华人民共和国国家标准[GB11643-1999].

[5]赵文龙,朱俊虎,王清贤.SQL Injection分析与防范.计算机工程与设计,第27卷第2期.

正则表达式的应用研究 第4篇

需求是这样子的:

现在有一个表单

代码如下:

.......

表单里面的省略号代表里面的内容,里面有各式各样的标签,

想写一个正则表达式匹配整个form表单,包括form标签,是html文件里面的内容。

首先想到的是:

代码如下:

这样子:

代码如下:

]*/form.>

还有这样子:

代码如下:

只要是form里面有标签的,这样都匹配不到内容,莫名其妙啊,也不知道是什么原因,

后来请教了一个正则表达式的高手,他告诉我了另外一种写法:

代码如下:

这涉及到了贪婪模式和非贪婪模式。

[sS] 意思是匹配所有 空白字符+非空白字符 , 说白了也就是全部字符都可以

* 意思是0个或多个, 直到遇到了后边的就停止了。

正则表达式基础及C#下的简单应用 第5篇

正则表达式,就是用某种模式去匹配一类字符串的一个公式。正则表达式可以快速地分析大量的文本以找到特定的字符模式;提取、编辑、替换或删除文本子字符串;或将提取的字符串添加到集合以生成报告。对于处理字符串的许多应用程序而言,正则表达式是不可缺少的工具。

2基础知识

正则表达式拥有一套自己的语法规则,常见语法包括:字符匹配、重复匹配、字符定位、转义匹配和其他高级语法(字符分组、字符替换和字符决策)。

2.1字符匹配语法

如表1所示

2.2重复匹配语法

如表2所示。

2.3字符定位语法

如表3所示。

2.4转义匹配语法

如表4所示。

2.5字符分组语法

如表5所示。

3常用正则表达式

(1)匹配HTML标记的正则表达式:<(.*)>.*|<(.*)/>例如:

(2)正整数:^[0-9]*[1-9][0-9]*$

(3)负整数:^-[0-9]*[1-9][0-9]*$

(4)整数:-?d+$

(5)正浮点数:^(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*))$

(6)负浮点数:^(-(([0-9]+.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*.[0-9]+)|([0-9]*[1-9][0-9]*)))$

(7)浮点数:^(-?d+)(.d+)?$

(8)26个英文字(不区分大小写):^[A-Za-z]+$

(9)26个大写英文字母:^[A-Z]+$

(10)26个小写英文字母:^[a-z]+$

(11)数字和26个英文字母混合:^[A-Za-z0-9]+$

(12)数字和26个英文字母与下划线混合:^w+$

(13)电子邮件地址:[w.-]+@([w-]+.)+[w-]+

(14)网址URL:^[a-zA-z]+://(w+(-w+)*)(.(w+(-w+)*))*(?S*)?$

(15)中国电话:((d{3,4})|d{3,4}-)?d{7,8}(-d{3})*例如:021-8888888或者0515-88888888或者021-88888888-888

(16)字母开头,允许5-16字节,允许字母数字下划线:[a-zA-Z][a-zA-Z0-9_]{6,20}$

17)首尾空格:(^s*)|(s*$)

(18)空行:n[s|]*r

(19)中国邮政编码:[1-9]d{5}(?!d)

(20)中国手机:(86)*0*13d{9}

(21)中国电话(包括手机):((d{3,4})|d{3,4}-|s)?d{7,14}

(22)日期:((((19){1}|(20){1})d{2})|d{2})[01]{1}d{1}[0-3]{1}d{1}如:20060518

4应用

4.1正则表达式类库及说明

正则表达式在英文中写作Regular Expression,根据正则表达式的使用范围和单词意思,C#中的正则表达式包含在.NET基础类库的一个名称空间下,这个名称空间就是System Text.RegularExpressions。该名称空间包括8个类,1个枚举,1个委托:

Capture、CaptureCollection、Group、GroupCollection、Match、MatchCollection、Regex、RegexCompilationInfo、RegexRunner和RegexRunnerFactory,如表6所示。

4.2构造正则表达的方法

构造正则表达式需要涉及Regex类,在Regex类中包括:IsMatch()、Replace()、Split()和Match的类:

4.2.1 IsMatch()

IsMatch()函数通过返回Bool值的方法来判断Regex构造函数中指定的正则表达式在输入字符串中是否找到匹配项,如果输入字符满足正则表达式,返回True,否则返回False。

例1:判断是否139开头的手机号码合法。

分析:139开头的电话号码组成139********,前面为固定号码13,后面满足8位数字。

设计正则表达式:139d{8}(解释:139为手机号开头固定,后面为数字d组成)

程序代码及运行结果如下所示:

4.2.2 Replace()

Replace()方法实际上是一种替换的方法,替换输入字符串中指定的正则表达式匹配项。

例2:在发布带有公开电子邮件地址的文章时,替换@为AT避免产生垃圾邮件。

分析:首先需要判断文章中是否电子邮箱地址,然后执行替换。

设计正则表达式:判断电子邮箱表达式:[w.-]+@([w-]+.)+[w-]+

程序代码及运行结果如下所示:

4.2.3 Split()

Split()方法是把由正则表达式匹配项定义的位置将输入字符串拆分为子字符串数组。

例3:将一段英文语句分割为单词

分析:英文语句以空格作为分隔符,需要通过""(空格)进行拆分

程序代码及运行结果如下所示:

5结语

通过查阅大量书籍,结合自身涉及到正则表达式方面的编程应用,对正则表达式的语法进行分类总结,同时给出部分常用的正则表达式及C#下简单的应用供读者理解和练习。希望能够让读者特别是广大初学者对正则表达式有一个清晰的脉络,不畏惧其繁琐的表达形式,并能够应用于日后的编程实践中。

摘要:通过表格的形式将正则表达式的语法进行总结,同时给出一些常用的正则表达式,方便读者在相关方面的练习与应用。最后通过列举C#下正则表达式简单应用,将正则表达式的语法应用于C#编程实践中,更方便大家理解与应用。

关键词:正则表达式,语法,C#

参考文献

[1](美)Jeffrey E.F.Friedl.精通正则表达式.3版.余晟,译.电子工业出版社,2007.

[2]Steve Mansour.正则表达式之道.Neo Lee,译.June 5,1999.

[3]MSDN.正则表达式语法.http://msdn.microsoft.com/zh-cn/library/ae5bf541(v=vs.80).aspx.

[4]CSDN.C#正则表达式应用实例.http://blog.csdn.net/hangh-wp/archive/2009/12/18/5028767.aspx.2009.

正则表达式的应用研究 第6篇

在国内外大中型数据库管理系统中,把Oracle作为数据库管理平台的用户比较多。10g以前的Oracle版本由于没有正则表达式,受到许多用户的谴责。也有许多人在BBS上找Oracle中的正则表达式,某公司还专门搞了几个jar,利用Oracle内置的java实现了它(asktom.oracle.com有介绍)。随着Oracle 10g的推出,这些都将成为历史。

正则表达式是一种源于unix的非常强大的数据检索技术。在perl中,它的功能更是得到了淋漓尽致的发挥,许多perl的爱好者都对它爱不释手。它是由元字符与规则字符组成,允许用户对搜索条件有更灵活的控制。而且对于规范如电话号,email地址,文件名等的格式也非常有用。在Oracle 10g中,增加了REGEXP_LIKE操作符,以及REGEXP_INSTR, REGEXP_SUBSTR和REGEXP_REPLACE等函数,使得在Oracle中也能方便自如地使用正则表达式。

正则表达式是定义复杂查询的一个强有力的工具。它定义了一个字符串的规则,一般的正则表达式使用了某些特殊的结构,所以它能匹配更多的字符串。例如,正则表达式hello|word既能匹配字符串“hello”也能匹配字符串“word”。举一个复杂一点的例子,正则表达式B{a,n}*s可以匹配字符串“Bananas”、“Baaaaas”、“Bs”以及其他任何以B开头以s结尾的字符串,中间可以包括任意个a和任意个n的组合。

1 正则表达式简介

1.1 正则表达式的定义

正则表达式用于查找和替换字符串中的模式。正则表达式是用某种语法定义的,正则表达式引擎采用这种语法并将它与字符串进行比较。引擎返回字符串是否与语法匹配的指示;也即,该字符串是否包含能够从该语法派生的子串。此外,引擎还能够返回匹配的子串。术语“模式(pattern)”用来表示语法。

最基本的模式仅由单个字母组成。当与该模式进行比较时,包含这个字母的字符串就是一个“匹配”。例如,如果模式是“a”,则字符串“abcd”就是一个匹配,而字符串“xyz”则不是。正则表达式的强大功能来自于预定义的运算符(也称为元字符),可以用很小的空间来表示模式。根据“方言”和受支持的功能,可以使用不同的元字符。通常,其中的一些可用字符如下:

(1)| 二中择一;(2)[] 分组;(3)* 多次出现(也匹配零次出现);(4)+ 多次出现(至少一次);(5) 随意的出现次数;(6) 反斜杠。

1.2 正则表达式的用途

Oracle中正则表达式的引入,使得用户可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR,REGEXP_SUBSTR以及REGEXP_REPLACE 函数来发挥正规表达式的作用。使用中可以体会到这个新功能如何对LIKE 操作符和INSTR,SUBSTR和REPLACE 函数进行补充。实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式能够以一种前所未有的方式来搜索、替换和验证数据,并提供高度的灵活性。

2 正则表达式在Oracle中的应用

2.1 Oracle中字符元的含义

句号(.)匹配正则表达式中的任意一个字符(不包括新的一行),例如正则表达式a.b匹配一个包括a,然后任意一个字符,然后是b的字符串,如字符串axb, xaybx, abba。如果要匹配以a开头以b结尾的三个字符的字符串, 必须使用^字符元指定开始行, 以符号结束,因此,正规表达式^a.b匹配的字符串如:aab, abb 或者axb, 就同LIKE 操作a_b一样。

默认情况,单个字符或者字符串列表在正则表达式中只匹配一次,如过要多次匹配,必须使用循环操作。如果匹配一个以a开头,以b结尾的字符串,正则表达式为:^a*b, *字符元重复0次,1次或者多次。表1列出了完全的重复操作。

如果在表达式中使用圆括号,可以创建子表达式,被重复执行数次。例如,正则表达式b(an)*a可以匹配ba,bana,banana,yourbananasplit等等。Oracle中正则表达式支持POSIX字符类,那意味着可以很精确的使用想要的字符类型。为一个不是按照字母顺序的记录写一个LIKE条件的查询, WHERE条件很容易变得非常复杂,POSIX字符类必须以方括号结束([]),例如正则表达式[[:lower:]]匹配一个小写字符,[[:lower:]]{5}匹配5个连续的小写字符。除了POSIX字符类以外,还可以在字符列中放置单独的字符,例如正则表达式^ab[cd]ef匹配字符串abcef和abdef字符c或者d必须被选中。大部分字符串列表中的字符元从字面上解释, 除了字符"^"和"-"。正则表达式看起来很复杂是由于有些字符元有多种意思, 这取决于上下文, "^"就是这样的一个字符元。如果"^"是字符列中的第一个字符,就表示对这个字符串取反,因此, [^[:digit:]]就是表示查找不包含数字的模式, ^[[:digit:]]匹配以数字开头的字符串。字符"-"表示一个范围,正则表达式[a-m]匹配从a到m的字母, 但是如果字符"-"在开头,就表示一个连字符,如[-afg]。前面的一个例子介绍了用圆括号创建子表达式, 可以用竖线(|)进入循环交替。如正则表达式t(a|e|i)n,允许t与n中的三个字符可以任选一个,匹配的字符串例如tan,tin和Pakistan,但不包括teen,mountain或者tune作为可选择的,表达式t(a|e|i)n 也可以被理解为字符列t[aei]n,表2列出了这些字符元。

2.2 Oracle中正则表达式应用举例

(1)REGEXP_LIKE 操作

下文的SQL查询中WHERE从句显示了怎么使用REGEXP_LIKE函数, 在ZIP列中查询满足正则表达式[^[:digit:]]的模式。查询返回ZIPCODE表中包含字符不全是数字的行:

SELECT zip

FROM zipcode

WHERE REGEXP_LIKE(zip,[^[:digit:]]);

查询结果:

ZIP

ab123

123xy

007ab

abcxy

这个例子中正则表达式只是由字符元组成,更多明确的数字字符类用冒号和方括号标示。第二组括号嵌套了一个字符类列表,这是个必不可少的,可以用POSIX字符类来创建字符列表。

(2)REGEXP_INSTR函数

这个函数返回模式的开始位置,有点像INSTR函数,两个函数不同之处是REGECP_INSTR可以指定一个模式而不是特定的查找字符串,这样就提供了强大的功能。下面的例子使用REGEXP_INSTR返回字符串"Joe Smith, 10045 Berry Lane, San Joseph, CA 91234"中5个邮政编码的开始位置,如果正则表达式写成[[:digit:]]{5},得到的将是门牌号而不是邮编,因为10045是第一个以5个数字出现的模式,因此必须用字符元""表明是最后一个,这个函数将返回邮编的开始位置而不管门牌号:

SELECT REGEXP_INSTR(Joe Smith, 10045 Berry Lane, San Joseph, CA 91234,[[:digit:]]{5})

AS RX_INSTR

FROM dual

查询结果:

RX_INSTR

45

这里扩展一下前文邮政编码的模式匹配,包括一个可选的4个数字,正则表达式为:

[[:digit:]]{5}(-[[:digit:]]{4}) 。如果源字符串以5个数字的邮编代码或5个数字的邮编+4个数字的邮编组成,这个正则表达式可以用来找到开始位置

SELECT REGEXP_INSTR(Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234,

[[:digit:]]{5}(-[[:digit:]]{4}) )

AS STARTS_AT

FROM dual

查询结果:

STARTS_AT

44

这个例子中括号内的表达式(-[[:digit:]]{4}) 被重复0次或者1次,由" "循环操作控制。如果试图用传统的SQL函数取得这样的结果对SQL专家来说都是很困难的。

(3)REGEXP_SUBSTR 函数

REGEXP_SUBSTR 函数和SUBSTR函数差不多,分解出字符串的一部分。下文的例子中,返回匹配模式",[^,]*,"的字符串,正则表达式查找逗号后面跟一个空格,后面跟着非","的字符或者字符串,最后以逗号结束:

SELECT REGEXP_SUBSTR(first field, second field , third field,

, [^,]*,)

FROM dual

查询结果:

,second field ,

(4)REGEXP_REPLACE 函数

传统的REPLACE函数,用一个字符串代替另一个,假设数据里有很多的空白字符要用一个空白字符替换,用REPLACE函数的话,必须指出替换多少个空白字符。下文的例子中在Joe和Smith中间有3个空白,REPLACE函数的参数指定用一个空白字符替换两个空白字符,这样就把原来的一个没有替换:

SELECT REPLACE(Joe Smith,,)

AS REPLACE

FROM dual

查询结果:

REPLACE

Joe Smith

下文的例子用一个空格替换两个或者多个空格。()子表达式包含一个空格,可以重复一次或者多次,由{2,}指示:

SELECT REGEXP_REPLACE(Joe Smith,( ){2,},)

AS RX_REPLACE

FROM dual

查询结果:

RX_REPLACE

Joe Smith

3 结束语

正则表达式是很有用的,可以用来解决复杂的问题。一些正则表达式的功能很难用传统的SQL函数表达出来。正是由于这个原因,正则表达式将会成为工具包里不可缺少的一部分,不仅是SQL,还包括其他的程序语言。虽然有时候要经过反复试验模式才能正确,但是正则表达式的功能是显而易见的。

摘要:首先介绍Oracle 10g中增加的新功能及正则表达式的发展,给出了正则表达式的定义以及其用途,分析了Oracle中各个字符元的含义,并结合具体的查询实例详细说明了正则表达式在Oracle中的应用。

关键词:正则表达式,Oracle,SQL语句,模式,匹配

参考文献

[1]Alice Rischert.Writing Better SQL Using Regular Expressions[EB/OL].http://otn.oracle.com/oramag/webcolumns/2003/techarti-cles/rischert_regexp_pt1.html.http://otn.oracle.com/oramag/webcolumns/2003/techarticles/rischert_regexp_pt2.html.

[2]胡欣杰.Oracle9i数据库管理员指南[M].北京:北京希望电子出版社,2002.

[3]Bill Pribyl,Steven Feuerstein.Oracle PL/SQL入门[M].段紫辉,郭旭,高小明,等译.2002.

正则表达式的应用研究 第7篇

因此,为了实现跨时段、跨区域A文件观测资料的查询统计以及在此基础上的复杂应用,建立了大连市A文件观测资料数据库,使用基于Framework 4的C#语言实现了将全市各个台站的A文件全部解码读入Oracle数据库。

1 地面气象观测数据

最新的2003年版《地面气象观测规范》是在1979年颁布的《地面气象观测规范》基础上根据服务需求和技术发展扩充了部分观测要素的测量范围,摒弃了过时不用的部分观测项目和内容重新规定了气象数据存储格式。但为兼顾历史资料,2003年版的观测规范兼容了1979年版的观测记录规范。但由于其设计初衷仅为地面观测规范使用,存在以下问题:一是存储方式为文本方式,体积小,便于存储和保存,但读取困难,在气象预报服务及科学研究中不能快速查询与分析,也不能对各种气象要素进行有效的组合,是一种单一的独立的存储方式。二是各要素的指示码因观测次数不同、观测时段不同和历史沿革的不同而有较大差别,要素指示码种类繁多,增加了气象资料的读取难度。三是因为各种原因导致气象要素观测值缺测、异常、单位不一致等特殊情况的存在,增加了地面气象观测数据的处理难度。

地面气象观测数据A文件由台站参数、观测数据、质量控制、附加信息构成,其中观测数据包括排列顺序固定的20个气象要素,分别是气压(P)、气温(T)、湿球温度(I)、水汽压(E)、相对湿度(U)、云量(N)、云高(H)、云状(C)、能见度(V)、降水量(R)、天气现象(W)、蒸发量(L)、积雪(Z)、电线积冰(G)、风(F)、浅层地温(D)、深层地温(K)、冻土深度(A)、日照时数(S)和草面温度(B)。每个气象要素为文件体中一组独立的数据单位,由指示码、方式位及该要素1个月的原始数据组成。根据气象站的分类不同及季节不同A文件内的观测数据也不同[3]。其结构如图1所示,采用自上而下的顺序存储方式,文件中各指示码对应的气象数据区块间相对独立。本文处理的文件包括经过人工审核的大连市辖区各台站自建站以来至2015年末的所有A文件。

2 A文件解码入库

2.1 数据库存储

A文件虽具有严格的数据存储编码格式,但同时也存在读取困难、通用性差、统计分析不便及无法网络应用等缺点,为此本文将A文件解码入库至Oracle数据库存储。Oracle数据库作为一种成熟关系型数据库,在存储地面气象观测数据时,具有提取简单、分析统计方便等优势。

2.2 文件解码流程

考虑到A文件观测数据地面要素种类多,编码规则繁杂,若想一次性将所有要素解码入库则较困难。本文解码入库思路为化繁为简,即分别按照20个气象要素标识逐个遍历所有A文件,从中提取出对应气象要素文本段,再将该气象要素解码入库。以气压(P)要素为例,解码流程如图2所示。

3 正则表达式的应用

3.1 正则表达式的定义

正则表达式(regular expression)是计算机科学中的一个概念,是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑[4,5,6]。可以通过正则表达式检查给定的字符串是否与其匹配,也可通过正则表达式从字符串中获取想要的特定部分。正是由于正则表达式字符处理能力强大、高效灵活、适应性强,广泛用于字符串的校验、替换和提取。

3.2正则表达式的应用

A文件是一种文件类型、要素方式位和编码方式繁杂多样的纯文本文件,如使用传统的文本读写方式往往需要逐行读入,再按照不同规则进行数据文本的合并和分离,其中可能需要进行多次读写处理,效率较低且容易出错。在.NET中使用正则表达式支持,需要引入System.Text.Regular Expressions命名空间,主要函数有以下几个:①Regex.Is Match()方法,返回一个bool值,如果有匹配项,返回True,否则返回False。②Regex.Replace()方法,使用制定的替换字符串替换与制定正则表达式匹配的所有字符串。③Regex.Match()方法,在输入字符串中搜索匹配正则表达式模式的子字符串,并将第一个匹配项作为单个匹配对象返回。④Regex.Split()方法,在由正则表达式模式定义的位置将输入字符串拆分为一个子字符串数组。

本文构造了多个正则表达式(C#语言实现)实现了一系列字符串操作,提高了处理效率。

(1)为了整理要素文本段格式,方便下一步的分割字符串,需要替换1个或多个连续空格为1个,使用正则表达式:

(2)从整个A文件里快速截取气压(P)要素文本段便于下一步处理,不采用逐行读入遍历的方式,使用正则表达式:

此表达式以多行模式匹配以字符P开始,中间有任意多个字符(包括换行符),并以等号结束的文本段。

此外对于有以D=代表整月缺测,以及D0、D7、D9三种指示码指示的浅层地温(D)要素一次性匹配所有可能性使用:

(3)A文件每天的数据以"."结尾,为了合并一天的数据到一行内,使用正则表达式替换不以.结尾的换行符为空格:

(4)文本段逐行(一行代表一天数据)以单个空格为分隔符分割获得每小时气压值并判断其是否为正常值:

(5)对于截取到的气象要素数据,判断该字符串是否为整数,以方便下一步进行转换并存入数据库可使用:Regex.Is Match(input,@"^-?d+$");//判断该字符串是否为整数(包括负整数)。

4 结语

大连市地面气象观测资料数据库的建立,完成了各台站建站以来地面气象观测数据的数据库存储,为气象观测资料的二次开发应用奠定了基础。而正则表达式在气象观测资料文件处理中的使用,使得字符串处理时节约大量编程的时间,极大提高工作效率,同时也能使所编写出来的程序代码更简洁,可维护性更强,解码入库的错误率降低。

参考文献

[1]管杰裕.正则表达式在气象信息处理中的应用[J].广西气象,2006,27(增刊1):107-108.

[2]田兰金,石声,李波,等.基于XML和正则表达式的气象数据处理系统[J].计算机科学,2013,40(11A):432-434.

[3]郜庆林,马琰钢,吴孟春,等.浙江省地面气象观测数据A文件资料解读入库方案[J].浙江气象,2009,30(增刊1):48-50.

[4]潘存良.基于PHP的正则表达式在气象信息处理中的应用[J].沙漠与绿洲气象,2015,9(增刊1):129-130.

[5]李耀东.呼伦贝尔气象资料A0文件的数据库存储实现[D].成都:电子科技大学,2014.

正则表达式优化算法研究 第8篇

1 反馈边问题

DFA算法和XFA算法中都存在反馈边过多的问题,极大的影响了算法对存储空间的需求,下面本文将给出自动机中转移边的分类方法以及其中反馈边问题的定义和描述。

1.1 反馈边的定义

图1所表示的是正则表达式{abcad}采用AC(Aho-Corasick)算法构造出的DFA,图中包括6个状态,15条转移边。根据转换目标的不同可以将这15条边分为4类:匹配失败边,重启边,反馈边,基本边。

失败边:图1中所有浅色边表示的转换称为失败边,失败边是指从某一个状态S转移到起始状态S0所经过的的转移边,表示当前输入的字符不在正则表达式{abcad}所描述的字符集范围内,匹配失败,重新开始对下一个字符进行匹配。

重启边:图1中所有虚线边表示的转换称为重启边,重启边是指从当前状态S转移到状态S1所经过的转移边,表示当前输入的字符为正则表达式{abcad}中的第一个字符,状态机跳到状态S1继续进行匹配。

反馈边:图1中加粗的边表示的转换称为反馈边,反馈边是指从当前状态S转换到状态S2的转移边,表示当前输入的字符与前一个输入的字符刚好匹配正则表达式{abcad}中的前两个字符,状态跳转到状态S2继续进行匹配。

基本边:图1中从状态S0一直连接到接收状态S5的一系列成功匹配的转移边称为基本边,它是所有成功匹配的输入必须要经过的边。

观察正则表达式{abcad}可以发现,该正则表达式中出现了2次字符a,而且其中一次出现在整个正则表达式的起始位置。在这种情况下,根据AC算法构造出的DFA就会产生一条反馈边,这条反馈边负责完成匹配输入为abcab*的功能。当输入字符a时,状态机跳转到状态S1,接着输入bca,状态机跳转到状态S4,当继续输入字符b的时候不能跳转到匹配失败时的状态S0,因为字符b的前一个输入字符为a,ab满足了反馈边的要求,所以应该指向第3个状态,状态S2。这样构造出的DFA才能够匹配类似与abcabcad这样的字符输入,符合正则表达式{abcad}描述的正确语义。

1.2 XFA中的反馈边

正则表达式{.*ab.*cd}与{.*df.*gh}合并后的XFA如图2所示,按照XFA构造算法的要求,首先第一步将两个正则表达式中带有.*结构的部分拆分,于是{.*ab.*cd}与{.*df.*gh}被拆分成{.*ab}、{.*cd}、{.*df}、{.*gh}四个表达式,然后转化成对应的DFA之后,状态S2添加一条指令信息:Bit1=true来表示{.*ab}被部分匹配的情况,与此同时状态S4添加一条指令信息:if(Bit1==true)Accept(regex1)来判断是否完成正则表达式{.*ab.*cd}的匹配。同样,在状态S6以及结束状态S8都添加了类似的指令信息,以达到消除DFA里面中间状态,避免出现状态爆炸的目的。

从图2中我们可以看到,存在一条从状态S4到状态S6的反馈边L4-6,产生这条反馈边的原因和多个DFA融合所产生的反馈边相同,都是因为在两个正则表达式中,存在某个公共字符位于其中的某一个表达式的首部。当出现公共字符的情况时,XFA中也必然会出现雷同的现象,在某些状态之间新增了一些反馈边。图3描述的是正则表达式{.*abcd.*cefg}与{.*dcge.*gkda}合并以后的XFA,从图中可以很明显的看到正则表达式之间的公共字符所引起的反馈边数量随着正则表达式长度的增加而明显增多,图3中所描述的XFA拥有状态数17个,基本边16条,1级反馈边7条,约占了所有边总数的1/3,根据图3中反馈边所占比例的分布情况可以预计随着正则表达式条数的增多和正则表达式长度的增长,反馈边的条数所占比例将会大大超过基本边的所占的比例。

2 CXFA算法

2.1 算法动机

动机一:反馈边问题不仅仅在DFA融合中存在,而且在高度压缩的XFA中也存在,甚至比DFA更加严重;

动机二:所有的反馈边所指向的状态都存在一条接收相同字符的边存在;

动机三:一级反馈边所占比例最大,消除一级反馈边可以极大的压缩存储空间;

动机四:一级反馈边的公共字符在第一级处理,消除一级反馈边相对于消除多级反馈边来讲实现代价最低。

2.2 形式化定义

传统的XFA进行匹配的基本模式如图4所示,Rule selector根据当前状态寄存器的值到转移边存储器中,通过查找的方法得到当前输入字符对应的下一状态,反馈回去,更新状态寄存器的值。与此同时,另外一边当前状态的值输入给变量存储器,通过查询和更新变量寄存器,完成XFA中指令信息的更新和查询功能。然后根据查询的结果输出XFA在当前输入字符下的匹配情况。

传统的XFA结构中并没有考虑到自动机状态之间的转移边的处理问题,基于算法动机二“反馈边所指向的状态都存在另外一条接收相同字符的基本边存在”的思想,我们可以试图通过利用这条接收相同字符的基本边来代替反馈边,从而达到消除一级反馈边,压缩自动机存储空间的目的。

这里我们提出一种CACHE-XFA自动机(简称CXFA)来达到消除失败边、重启边和1级反馈边,压缩存储空间的目的。在XFA自动机的基础上,增加一个独立的CACHE状态寄存器,由当前状态寄存器和CACHE状态寄存器共同配合完成XFA自动机状态切换,CXFA的详细结构如图5所示。

传统的XFA下一个状态的生成只与当前状态和输入字符相关,CXFA中下一状态的生成不仅与当前状态和当前输入字符相关,同时CACHE状态也对下一状态的生成产生影响。CXFA利用一个CACHE寄存器存储备用状态,输入字符在当前状态没有下一个状态的情况下,启用CACHE寄存器中存储的备用状态来接收当前字符,达到压缩自动机中冗余转移边的目的。CXFA的形式化定义如下:

定义基于状态的CXFA是一个九元组(Q,Σ,D,C,δ,θ,U,(q0,d0),F),其中:

(1)Q是一个有穷的状态集合。

(2)Σ是一个有穷的输入符号集合,一般称为字母表Σ。

(3)D是一个有穷的变量值的集合。

(4)C是一个CACHE状态集合,C是Q的一个子集。

(5)迁移函数δ是一个以Q中一个状态、C中的一个状态和Σ中一个输入字母为变量并返回Q中状态的函数。

(6)CACHE生成函数θ是一个以起始状态q0和Σ中一个输入字母为变量并返回C中状态的函数。

(7)变量更新函数U是一个对每个状态以Q中一个状态和D中一个变量值为变量并返回D中变量的函数。

(8)(q0,d0,c0)是初始配置,初始配置包含初始状态q0,变量的初始值d0,cache的初始值c0。

(9)接受配置F是Q和D的子集,集合的每个元素包含接受状态和变量的值。

2.3 CXFA中的Cache策略

在预处理阶段,删除从正则表达式集合生成出的CXFA中的失败边、重启边和1级反馈边,转移边集合中只包括基本边和n级反馈边。在字符匹配的阶段,CXFA通过状态转移函数和Cache状态生成函数来完成自动机的状态切换。

CXFA采用了3个输入状态的查表机制,在只存有基本边和n级反馈边的转移边存储器内查找Cache_State、Cur_State、S0所对应的INPUT字符的下一个状态,得到3个不同优先级的next状态S0_next、Cur_next、Cache_next。其中Cur_next优先级最高,Cache_next其次,S0_next优先级最低,通过一个优先级仲裁器输出最终的下一个状态返回给Cur_State寄存器完成一轮自动机状态切换。每一轮的转换过后将S0_next的输出返回给Cache_State寄存器,完成Cache更新操作。

如图7所示的CXFA是图3中的XFA经过删除失败边、重启边、1级反馈边以后得到的自动机。

对于正则表达式{.*abcd.*cefg}与{.*dcge.*gkda}对应的CXFA,输入字符流{abcgkdcgegkda}的状态转换过程如表1所示。表中第一列代表当前的输入字符,第二列代表当前状态,第三列代表CACHE状态,第4,5,6列分别代表生成Next_state的三个仲裁项Cache_state、Cur_next和Cache_next,最后两列代表CXFA中的两个变量的值。首先初始化Cur_state为S0,Cache_state为NULL,在收到第一个字符a的时候经过查找运算得到Cur_next为S1,Cache_next为NULL,S0_next为S1。Next_state取优先级最高的Cur_next,更新第二行的Cur_state为S1,同时更新Cache_state为第一行的S0_next:S1。依此类推,当状态上出现变量更新操作时,更新右边两栏对应的变量值。第13行,Cur_state为S15,Cache_next为S9时,当前输入的字符为a,根据查表运算得到Cur_next为S16,Cache_next为NULL,S0_next为S1,更新下一行。当前Cur_state为S16,Next_state为NULL,同时检查变量Bit2,看到Bit2等于1,输出匹配成功标志accept,完成CXFA匹配。从这里可以看出CXFA算法和XFA算法在功能上是等价的。

表1 CXFA匹配算法执行流程示意表

通过分析字符流{abcgkdcgegkda}的CXFA处理过程可以看出,在删除了失败边、重启边以及1级反馈边的基础上,CXFA在增添了1个Cache状态寄存器和一个优先级仲裁机制之后。通过对S0_next、Cur_next、Cache_next进行仲裁产生了正确的下一状态,能够顺利的完成状态更新,指令执行,变量赋值等XFA基本操作,成功的完成正则表达式匹配的任务,达到了压缩状态转移表,进一步缩小XFA存储空间的目的。

3 算法性能测试

本节将对CXFA算法在SNORT规则集上面的性能进行全面的测试,并对CXFA算法在SNORT规则的适用性进行评估。

本节的适用性测试选取了SNORT规则集中最具有代表性的六种应用层协议规则集作为基准测试集,它们分别是FTP.rules、SMTP.rules、POP3.rules、IMAP.rules、Vo IP.rules和Web-IIS.rules。

SMTP.rules、POP3.rules、IMAP.rules、Vo IP.rules和Web-IIS.rules规则集中CXFA算法相对于D2FA算法和XFA算法的存储规模比如图8所示。从图中线条的走势可以看出CXFA算法具有非常高的压缩率,同时CXFA算法相对于两种算法的压缩比与规则集的大小成正比。SMTP.rules规则集的总长度为2746,CXFA算法无论是相对于D2FA还是XFA都拥有超过30倍的压缩比;相反在规则集规模较小的POP3和IIS中,CXFA算法相对于D2FA的压缩比仅为16.7倍和2.7倍。在POP3和IIS规则集中,D2FA算法的存储压缩效果优于XFA算法。出现这样的情况的原因是由于,在规则集规模减小的情况下,转移边数目对存储的需求大于状态爆炸所引起的存储需求,此时XFA算法压缩效果比较一般。CXFA算法的提出避免了以上情况的发生,在规则集规模较小的情况下,CXFA仍然能够保证非常高的压缩性能。

CXFA算法在XFA算法致力于消除中间状态的基础上,消除了原本自动机中的失败边、重启边、1级反馈边,极大的压缩了边存储空间。在SNORT规则适用性的测试结果表明CXFA算法的存储性能平均是D2FA算法存储性能的40倍,是XFA算法的18倍。

4 总结

正则表达式的应用研究 第9篇

关键词:自然语言理解,语料数据预处理,正则表达式

1. 引言

篇章关系识别是计算机自然语言处理 (Natural Language Processing) 领域中语义 (Semantics) 研究的难点, 语料库结合机器学习分类是该研究的主要路径之一, 而将语料数据转换成适合篇章关系识别训练与测试数据过程通常比较繁琐, 在公开发表的文献中通常介绍了特征选择及分类方法, 但对如何进行语料数据的预处理却很少涉及, 作者结合自身研究过程, 认为语料数据的预处理问题虽然非常繁琐, 但却是在篇章关系识别中首先要面对的问题, 选择合适语料预处理的算法通常要面临以下步骤:

(1) 熟悉语料库功能、结构及标注规则, 研究者只有深入理解语料库才能加工出适用的语料数据;

(2) 熟悉机器学习算法原理, 掌握软件包对输入及输出数据格式规定;

(3) 熟悉自身研究领域特点, 对分类特征选择有深入研究;

(4) 综合上述3步骤, 选择合适的数据结构及算法, 完成语料数据预处理。

正则表达式 (Regular Expressions) 是文本处理中一种强大的工具, 自然语言处理领域许多编程工具如Java、Python都提供了正则表达式处理机制, 合理地使用正则表达性可以极大地简化文本处理过程, 提高文本处理的效率。

本文以Penn Disourse TreeBank语料库在隐式篇章关系处理中研究过程为例, 结合正则表达式的使用介绍一种语料数据预处理的有效方法。

2. PDTB语料库

文本篇章结构关系 (Discourse Relations) 研究主要涉及短语、子句、句子等文本基本单元及更大跨度的文本区域 (如段落、文档) 之间的结构关系研究, 通过分析关联文本区域之间内在的语义联系, 构建文本篇章关系结构, 进而更深入地理解文本语义。文本单元间的篇章关系常见的有比对、因果、时序、延展等关系, 文本单元间篇章关系分析在信息抽取、自动问答、自动摘要、情感分析等自然语言处理中有着广泛而重要的作用。

在篇章关系 (Discourse Relations) 分析主要遵循修辞结构理论识别基本篇章单元 (Elemental Discourse Units, 即EDUs) 之间的关系, 通常采用的研究路径根据篇章语料标注线索学习篇章关系, 建立分类的模型, 再将分类模型应用在测试语料中进行识别, 在此基础上构建Discourse Parser。Penn Discourse Treebank (PDTB) 语料库是这一研究路径中常用的语料库。PDTB语料库对语料样本的描述格式本身具有一定结构关系, 但这种结构关系主要以多行文本域列表形式体现, 没有采用符合程序设计算法需要的数据结构形式, 因此必须经过格式转换才能处理, 这个转换过程采用通常的字符串处理程序设计方法费时费力, 而结合正则表达式进行处理可以成倍提高编程效率。

3. 正则表达式 (Regular Expressions)

正则表达式是用于文本匹配的工具, 可以在源字符串搜索、替换和解析字符串, 功能强大, 使用灵活。一个正则表达式是由字母、数字和称为元字符 (metecharacters) 的特殊字符 (如括号、星号、问号等) 组成, 这些元字符对正则表达式有特殊意义, 是构成正则表达式的要素。参考文献【1】说明了这些元字符的含义和正则表达式的使用原理。

本文以Java为例说明用于PDTB语料库中样本结构提取的正则表达式构建。

4. 构建正则表达式

Java中正则表达式机制主要由java.util.regex模块实现, 这个模块中主要包括构建正则表达式模板的Pattern类、处理匹配对象的Matcher类, 配合Matcher类处理匹配对象MatchResult接口, 以及处理正则表达式格式不正确的PatternSyntaxException异常类。下面是在编程常用的程序片断:

下面以Implicit样本为例说明正则表达式构建思路:

(1) 样本头部

PDTB语料中一个样本结构以连续下划线开始并以连续下划线结束, 为了提取样本结构边界构建正则表达式如下:

(2) 篇章关系名称

PDTB语料中一个样本名称文本结构如下:

构建正则表达式如下:

(3) 特征区域头部

PDTB语料中一个样本中特征区域头部文本结构如下:

构建正则表达式如下:

(4) 属性文本

PDTB语料中一个样本中特征区域中属性文本结构形如:

构建正则表达式如下:

(5) Argument头部

PDTB语料中一个样本Arg1、Arg2头部形如:

构建正则表达式如下:

(6) 其他

对于语料中其他文本结构均可以采用本文介绍的思路进行正则表达式构建, 限于篇幅不再一一叙述。

5. 结束语

自然语言处理中语料库的预处理是每一位研究人员必做的工作, 但这项工作的繁琐也常常令人生畏, 在处理中结合正则表达式进行文本处理无疑是一种高效实用的方法, 希望本文能起到抛砖引玉的作用。

参考文献

[1]Jeffrey Friedl.Mastering Regular Expressions, 3rd.O’REILLYMedia, Inc.2002

上一篇:究竟下一篇:技术知识表达能力