搜档网
当前位置:搜档网 › 正则表达式

正则表达式

正则表达式
正则表达式

1.验证用户名和密码:("^[a-zA-Z]\w{5,15}$")正确格式:"[A-Z][a-z]_[0-9]"组成,并且第一个字必须为字母6~16位;

2.验证电话号码:("^(\d{3,4}-)\d{7,8}$")正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx;

3.验证手机号码:"^1[3|4|5|7|8][0-9]\\d{8}$";

4.验证身份证号(15位或18位数字):"\d{14}[[0-9],0-9xX]";

5.验证Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$");

6.只能输入由数字和26个英文字母组成的字符串:("^[A-Za-z0-9]+$");

7.整数或者小数:^[0-9]+([.][0-9]+){0,1}$

8.只能输入数字:"^[0-9]*$"。

9.只能输入n位的数字:"^\d{n}$"。

10.只能输入至少n位的数字:"^\d{n,}$"。

11.只能输入m~n位的数字:"^\d{m,n}$"。

12.只能输入零和非零开头的数字:"^(0|[1-9][0-9]*)$"。

13.只能输入有两位小数的正实数:"^[0-9]+(\.[0-9]{2})?$"。

14.只能输入有1~3位小数的正实数:"^[0-9]+(\.[0-9]{1,3})?$"。

15.只能输入非零的正整数:"^\+?[1-9][0-9]*$"。

16.只能输入非零的负整数:"^\-[1-9][0-9]*$"。

17.只能输入长度为3的字符:"^.{3}$"。

18.只能输入由26个英文字母组成的字符串:"^[A-Za-z]+$"。

19.只能输入由26个大写英文字母组成的字符串:"^[A-Z]+$"。

20.只能输入由26个小写英文字母组成的字符串:"^[a-z]+$"。

21.验证是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。

22.只能输入汉字:"^[\u4e00-\u9fa5]{0,}$"。

23.验证URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。

24.验证一年的12个月:"^(0?[1-9]|1[0-2])$"正确格式为:"01"~"09"和"10"~"12"。

25.验证一个月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正确格式为;"01"~"09"、"10"~"29"和“30”~“31”。

26.获取日期正则表达式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日?

评注:可用来匹配大多数年月日信息。

27.匹配双字节字符(包括汉字在内):[^\x00-\xff]

评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

28.匹配空白行的正则表达式:\n\s*\r

评注:可以用来删除空白行

29.匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />

评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

30.匹配首尾空白字符的正则表达式:^\s*|\s*$

评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

31.匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*

评注:网上流传的版本功能很有限,上面这个基本可以满足需求

32.匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

评注:表单验证时很实用

33.匹配腾讯QQ号:[1-9][0-9]{4,}

评注:腾讯QQ号从10 000 开始

34.匹配中国邮政编码:[1-9]\\d{5}(?!\d)

评注:中国邮政编码为6位数字

35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。

评注:提取ip地址时有用

36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]

Function IsRegu(Regu,s)

'正则表达式校验

If Regu="" Then

Exit Function

End if

Dim Re,Sre

Set Re = New RegExp

Re.Pattern = Regu

Sre = Re.Test(s)

If Sre = True Then

IsRegu = True

Else

IsRegu = False

End If

End Function

tmp=" "

if (IsRegu("\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*",tmp )) =false then

msgbox "E-mail地址不合法!"

FieldCheck#N=false

不同的语言(如PHP和JAVA)、相同语言的不同类库(如来自Sun的Java Regular Expression类库跟Apache Jakarta的正则表达式类库)间,用法会有所差别,在使用的时候,要注意这些差别。

4.正則表達式應用

"^\d+$"//非负整数(正整数+ 0)

"^[0-9]*[1-9][0-9]*$"//正整数

"^((-\d+)|(0+))$"//非正整数(负整数+ 0)

"^-[0-9]*[1-9][0-9]*$"//负整数

"^-?\d+$"//整数

"^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0)

"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数

"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0)

"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"

//负浮点数

"^(-?\d+)(\.\d+)?$"//浮点数

"^[A-Za-z]+$"//由26个英文字母组成的字符串

"^[A-Z]+$"//由26个英文字母的大写组成的字符串

"^[a-z]+$"//由26个英文字母的小写组成的字符串

"^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串

"^\w+$"//由数字、26个英文字母或者下划线组成的字符串

"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址

"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url

/^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日

/^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年

"^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3}) (]?)$" //Emil

"(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码

"^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0 -5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址

^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式

^[-+]?\d+(\.\d+)?$ //值类型正则表达式

//校验是否全由数字组成

functionisDigit(s)

{

varpatrn=/^[0-9]{1,20}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

functionisRegisterUserName(s)

{

varpatrn=/^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验用户姓名:只能输入1-30个以字母开头的字串functionisTrueName(s)

{

varpatrn=/^[a-zA-Z]{1,30}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验密码:只能输入6-20个字母、数字、下划线functionisPasswd(s)

{

varpatrn=/^(\w){6,20}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验普通电话、传真号码:可以“+”开头,除数字外,可含有“-”functionisTel(s)

{

//var patrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?(\d){1,12})+$/; varpatrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验手机号码:必须以数字开头,除数字外,可含有“-”functionisMobil(s)

{

varpatrn=/^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验邮政编码

functionisPostalCode(s)

{

//var patrn=/^[a-zA-Z0-9]{3,12}$/;

varpatrn=/^[a-zA-Z0-9 ]{3,12}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

//校验搜索关键字

functionisSearch(s)

{

varpatrn=/^[^`~!@#$%^&*()+=|\\\][\]\{\}:;\'\,.<>/?]{1}[^`~!@$%^&()+=|\\\][\]\{\ }:;\'\,.<>?]{0,19}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

functionisIP(s) //by zergling

{

varpatrn=/^[0-9.]{1,20}$/;

if(!patrn.exec(s)) returnfalse

returntrue

}

/****************************************************************************** ***

* FUNCTION: isBetween

* PARAMETERS: val AS any value

* lo AS Lower limit to check

* hi AS Higher limit to check

* CALLS: NOTHING

* RETURNS: TRUE if val is between lo and hi both inclusive, otherwise false.

******************************************************************************* ***/

functionisBetween (val, lo, hi) {

if((val < lo) || (val > hi)) { return(false); }

else{ return(true); }

}

/****************************************************************************** ***

* FUNCTION: isDate checks a valid date

* PARAMETERS: theStr AS String

* CALLS: isBetween, isInt

* RETURNS: TRUE if theStr is a valid date otherwise false.

******************************************************************************* ***/

functionisDate (theStr) {

varthe1st = theStr.indexOf('-');

var the2nd = https://www.sodocs.net/doc/1d19074937.html,stIndexOf('-');

if (the1st == the2nd) { return(false); }

else {

var y = theStr.substring(0,the1st);

var m = theStr.substring(the1st+1,the2nd);

var d = theStr.substring(the2nd+1,theStr.length);

var maxDays = 31;

if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {

return(false); }

else if (y.length < 4) { return(false); }

else if (!isBetween (m, 1, 12)) { return(false); }

else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;

else if (m==2) {

if (y % 4 > 0) maxDays = 28;

else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;

else maxDays = 29;

}

if (isBetween(d, 1, maxDays) == false) { return(false); }

else { return(true); }

}

}

/****************************************************************************** ***

* FUNCTION: isEuDate checks a valid date in British format

* PARAMETERS: theStr AS String

* CALLS: isBetween, isInt

* RETURNS: TRUE if theStr is a valid date otherwise false.

******************************************************************************* ***/

function isEuDate (theStr) {

if (isBetween(theStr.length, 8, 10) == false) { return(false); }

else {

var the1st = theStr.indexOf('/');

var the2nd = https://www.sodocs.net/doc/1d19074937.html,stIndexOf('/');

if (the1st == the2nd) { return(false); }

else {

var m = theStr.substring(the1st+1,the2nd);

var d = theStr.substring(0,the1st);

var y = theStr.substring(the2nd+1,theStr.length);

var maxDays = 31;

if (isInt(m)==false || isInt(d)==false || isInt(y)==false) {

return(false); }

else if (y.length < 4) { return(false); }

else if (isBetween (m, 1, 12) == false) { return(false); }

else if (m==4 || m==6 || m==9 || m==11) maxDays = 30;

else if (m==2) {

if (y % 4 > 0) maxDays = 28;

else if (y % 100 == 0 && y % 400 > 0) maxDays = 28;

else maxDays = 29;

}

if (isBetween(d, 1, maxDays) == false) { return(false); }

else { return(true); }

}

}

}

/****************************************************************************** **

* FUNCTION: Compare Date! Which is the latest!

* PARAMETERS: lessDate,moreDate AS String

* CALLS: isDate,isBetween

* RETURNS: TRUE if lessDate

******************************************************************************* **/

function isComdate (lessDate , moreDate)

{

if (!isDate(lessDate)) { return(false);}

if (!isDate(moreDate)) { return(false);}

var less1st = lessDate.indexOf('-');

var less2nd = https://www.sodocs.net/doc/1d19074937.html,stIndexOf('-');

var more1st = moreDate.indexOf('-');

var more2nd = https://www.sodocs.net/doc/1d19074937.html,stIndexOf('-');

var lessy = lessDate.substring(0,less1st);

var lessm = lessDate.substring(less1st+1,less2nd);

var lessd = lessDate.substring(less2nd+1,lessDate.length);

var morey = moreDate.substring(0,more1st);

var morem = moreDate.substring(more1st+1,more2nd);

var mored = moreDate.substring(more2nd+1,moreDate.length);

var Date1 = new Date(lessy,lessm,lessd);

var Date2 = new Date(morey,morem,mored);

if (Date1>Date2) { return(false);}

return(true);

}

/****************************************************************************** ***

* FUNCTION isEmpty checks if the parameter is empty or null

* PARAMETER str AS String

******************************************************************************* ***/

function isEmpty (str) {

if ((str==null)||(str.length==0)) return true;

else return(false);

}

/****************************************************************************** ***

* FUNCTION: isInt

* PARAMETER: theStr AS String

* RETURNS: TRUE if the passed parameter is an integer, otherwise FALSE

* CALLS: isDigit

******************************************************************************* ***/

function isInt (theStr) {

var flag = true;

if (isEmpty(theStr)) { flag=false; }

else

{ for (var i=0; i

if (isDigit(theStr.substring(i,i+1)) == false) {

flag = false; break;

}

}

}

return(flag);

}

/****************************************************************************** ***

* FUNCTION: isReal

* PARAMETER: heStr AS String

decLen AS Integer (how many digits after period)

* RETURNS: TRUE if theStr is a float, otherwise FALSE

* CALLS: isInt

******************************************************************************* ***/

function isReal (theStr, decLen) {

var dot1st = theStr.indexOf('.');

var dot2nd = https://www.sodocs.net/doc/1d19074937.html,stIndexOf('.');

var OK = true;

if (isEmpty(theStr)) return false;

if (dot1st == -1) {

if (!isInt(theStr)) return(false);

else return(true);

}

else if (dot1st != dot2nd) return (false);

else if (dot1st==0) return (false);

else {

var intPart = theStr.substring(0, dot1st);

var decPart = theStr.substring(dot2nd+1);

if (decPart.length > decLen) return(false);

else if (!isInt(intPart) || !isInt(decPart)) return (false);

else if (isEmpty(decPart)) return (false);

else return(true);

}

}

/****************************************************************************** ***

* FUNCTION: isEmail

* PARAMETER: String (Email Address)

* RETURNS: TRUE if the String is a valid Email address

* FALSE if the passed string is not a valid Email Address

* EMAIL FORMAT: AnyName@EmailServer e.g; webmaster@https://www.sodocs.net/doc/1d19074937.html,

* @ sign can appear only once in the email address.

******************************************************************************* **/

function isEmail (theStr) {

var atIndex = theStr.indexOf('@');

var dotIndex = theStr.indexOf('.', atIndex);

var flag = true;

theSub = theStr.substring(0, dotIndex+1)

if ((atIndex < 1)||(atIndex != https://www.sodocs.net/doc/1d19074937.html,stIndexOf('@'))||(dotIndex < atIndex + 2)||(theStr.length <= theSub.length))

{ return(false); }

else{ return(true); }

}

/****************************************************************************** ***

* FUNCTION: newWindow

* PARAMETERS: doc -> Document to open in the new window

hite -> Height of the new window

wide -> Width of the new window

bars -> 1-Scroll bars = YES 0-Scroll Bars = NO

resize -> 1-Resizable = YES 0-Resizable = NO

* CALLS: NONE

* RETURNS: New window instance

******************************************************************************* ***/

functionnewWindow (doc, hite, wide, bars, resize) {

varwinNew="_blank";

varopt="toolbar=0,location=0,directories=0,status=0,menubar=0,";

opt+=("scrollbars="+bars+",");

opt+=("resizable="+resize+",");

opt+=("width="+wide+",");

opt+=("height="+hite);

winHandle=window.open(doc,winNew,opt);

return;

}

/****************************************************************************** ***

* FUNCTION: DecimalFormat

* PARAMETERS: paramValue -> Field value

* CALLS: NONE

* RETURNS: Formated string

******************************************************************************* ***/

functionDecimalFormat (paramValue) {

varintPart = parseInt(paramValue);

vardecPart =parseFloat(paramValue) - intPart;

str = "";

if((decPart == 0) || (decPart == null)) str += (intPart + ".00");

elsestr += (intPart + decPart);

return(str);

}

正则表达式

正则表达式 一、什么是这则表达式 正则表达式(regular expressions)是一种描述字符串集的方法,它是以字符串集中各字符串的共有特征为依据的。正则表达式可以用于搜索、编辑或者是操作文本和数据。它超出了java程序设计语言的标准语法,因此有必要去学习特定的语法来构建正则表达式。一般使用的java.util.regex API所支持的正则表达式语法。 二、测试用具 import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Regex{ public static void main(String[]args)throws Exception{ BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); if(br==null){ System.out.println("没有输入任何数据"); System.exit(1); } while(true){ System.out.print("输入表达式:"); Pattern pattern=https://www.sodocs.net/doc/1d19074937.html,pile(br.readLine()); System.out.print("输入字符串:"); Matcher matcher=pattern.matcher(br.readLine()); boolean found=false; while(matcher.find()){ System.out.println("找到子字符串"+matcher.group()+" 开始于索引"+matcher.start()+"结束于索引"+matcher.end()+"\n") found=true; } if(!found){ System.out.println("没有找到子字符串\n"); } } } }

word文档中批量删除英文或者中文、标点的方法

删除英文方法: 按ctrl+H查找替换就可以了!在查找内容中输入^$替换为^p,点“全部替换”,这时所有的英文都会被删除了,并且会自动换行出来! 删除汉字和中文标点: 同上在查找内容输入“[!^1-^127]”(输入引号之间的内容,这表示所有非西文字符,即所有汉字和中文标点符号)。替换内容什么也不要输入,点全部替换。 删除汉字: 用Ctrl+H打开查找和替换,高级选项里的“使用通配符”要记得选上。 输入查找内容“[一-龥]”(输入引号之间的内容,这表示所有的中文汉字),替换内容什么也不要输入,即删除所有查找内容。 删除汉字和中文标点: 同上在查找内容输入“[!^1-^127]”(输入引号之间的内容,这表示所有非西文字符,即所有汉字和中文标点符号),这个就有点正则表达式的意思了。 替换内容什么也不要输入。 ================= 请用查找替换法,在钩选通配符下: [^1-^127]所有西文 [!^1-^127]所有西文以外字符 Word小技巧: 仅删除文件里的中文或英文

如果我们在一份混杂着全角与半角的中英文、数字和符号的文件中,只想单独删除里头的英文字或中文字时,除了一个字删除之外,有什么比较快速简便的方法吗? 1.首先开启我们想处理的文件,其中包含全角与半角的中英文、数字和符号,并点选菜单【编辑】→【取代】。 ※[ ]里的「^1-^127」表示ASCII字码的编号1至127,其中编号48~57代表数字「0~9」,65~90代表大写英文字母「A~Z」,97~122代表小写英文字母「a~z」。 2.在「寻找及取代」对话盒中的「寻找目标」输入「[^1-^127]」,接着点选〔更多〕后,勾选「使用万用字符」,并按下〔全部取代〕。 3.此时可以看到文件中所有半角的英文字、数字及符号,全都删除掉了。 ※由于中文字都是全角,没有半角的,因此不会受影响。 4.不存盘关闭档案并重新开启后,这次在「寻找及取代」对话盒中的「寻找目标」输入「[!^1-^127]」,并在点选〔更多〕后勾选「使用万用字符」,按下〔全部取代〕。 5.可以发现这次是把全角的中英文、数字及符号,全都删除掉,只剩下半角的部分。

find与grep命令简介及正则表达式

find与grep命令简介及正则表达式写给大家看的Shell脚本编程入门教程索引 两个更为有用的命令和正则表达式 在我们开始学习新的Shell编程知识之前,我们先来看一下两个更为有用的两个命令,这两个命令虽然并不是Shell的一部分,但是在进行Shell编程时却会经常用到.随后我们会来看一下正则表达式. find命令 我们先来看的是find命令.这个命令对于我们用来查找文件时是相当有用的,但是对于Linux新手来说却有一些难于使用,在一定程序是由于他所带的选项,测试,动作类型参数,而且一个参数的执行结果会影响接下来的参数. 在我们深入这些选项和参数之前,我们先来看一个非常简单的例子.假如在我们的机子上有一个文件wish.我们来进行这个操作时要以root身份来运行,这样就可以保证我们可以搜索整个机子: #find/-name wish-print /usr/bin/wish # 正如我们可以想到的,他会打印出搜索到的结果.很简单,是不是? 然而,他却需要一定的时间来运行,因为他也会同时搜索网络上的Window机器上的磁盘.Linux机器会挂载大块的Window机器的文件系统.他也会同时那些位置,虽然我们知道我们要查找的文件位于Linux机器上. 这也正是第一个选项的用武之地.如果我们指定了-mount选项,我们就可以告诉find命令不要搜索挂载的目录.

#find/-mount-name wish-print /usr/bin/wish # 这样我们仍然可以搜索这个文件,但是这一次并没有搜索挂载的文件系统. find命令的完整语法如下: find[path][options][tests][actions] path是一个很简单的部分:我们可以使用绝对路径,例如/bin,或者是使用相对路径,例如..如果我们需要我们还可以指定多个路径,例如find/var/home 主要的一些选项如下: -depth在查看目录本身以前要先搜索目录中的内容 -follow跟随符号链接 -maxdepths N在搜索一个目录时至多搜索N层 -mount(或-xdev)不要搜索其他的文件系统 下面的是一些test的选项.我们可以为find命令指定大量的测试,并且每一个测试会返回真或是假.当find命令工作时,他会考查顺序查找到的文件,并且会在这个文件上按顺序进行他们所定义的测试.如果一个测试返回假,find命令会停止他当前正在考查的文件并继续进行下面的动作.我们在下表中列出的只是一些我们最常用到的测试,我们可以通过查看手册页得到我们可以利用find 命令使用的可能的扩展列表项. -atime NN天以前访问的文件 -mtime NN天以前修改的文件

正则表达式经典手册

引言 正则表达式(regular expression)就是用一个“表达式”来描述一个特征,然后去验证另一个“字符串”是否符合这个特征。比如表达式“ab+” 描述的特征是“一个 'a' 和任意个'b' ”,那么 'ab', 'abb', 'abbbbbbbbbb' 都符合这个特征。 正则表达式可以用来:(1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。(2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。(3)用来替换,比普通的替换更强大。 正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。 文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。 1. 正则表达式规则 1.1 普通字符 字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。 举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同) 举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。 1.2 简单的转义字符 一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

正则表达式1

正则表达式 7.1、在JavaScript中,正则表达式是对Perl版的改进和发展。 7.2、^表示一个字符串的开始,$表示一个字符串的结束。 7.3、(?:...)表示一个非捕获型分组(noncapturing group)。 7.4、(...)表示一个捕获型分组(capturing group)。 7.5、[...]表示一个字符类,[^?#]表示一个字符类包含除?和#之外的所有字符。 7.6、有两个方法来创建RegExp对象。优先采用正则表达式字面量。如下: var my_regexp=/"(?:\\.|[^\\\"])*"/g;但如果要使用RegExp构造器创建一个正则表达式,要多加小心,因为反斜杠在正则表达式和在字符串字面量中有不同的含义。通常需要双写反斜杠及对引号进行转义: var my_regexp=new RegExp("\"(?:\\.|[^\\\\\\\"])*\"",'g');7.7、在RegExp中,有三个标志:g、i和m。 7.8、RegExp对象的属性 属性用法 global如果标志g被使用,值为true ignoreCase如果标志i被使用,值为true lastIndex下一次exec匹配开始的索引。初始值为0 multiline如果m被使用,值为true source正则表达式源代码文本 7.9、一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符以外,所有的字符都将被按照字面处理:\/[](){}?+*|.^$ 如果上面列出的字符按字面去【匹配,那么必须要一个\前缀来进行转移。 7.10、正则表达式转义: \f是换页符,\n是换行符,\r是回车符,\t是制表符,\u允许指定一个Unicode字符来表示一个十六进制的常量 \d等同于[0-9] \s等同于[\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]。这是Unicode空白符的一个不完全子集。\S表示与其相反的:[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029] \w等同于[0-9A-Z_a-z]。\W则表示与其相反。 \b被指定为一个字的边界标志。 \1是指分组1所捕获到的文本的一个引用,\2指向分组2的引用,\3指向分组3的引用,以此类推。 7.11、正则表达式分组共有4种:捕获型、非捕获型、向前正向匹配和向前负向匹配。7.12、正则表达式字符类内部的转义规则和正则表达式因子相比稍有不同。[\b]是退格符。下面是在字符类中需要被转义的特殊字符: -/[\]^ 7.13、正则表达式因子可以用一个正则表达式量词后缀,用来决定这个因子应该被匹配的次数。包围在一对花括号中的一个数字表示这个因子应该被匹配的次数。所以,/www/和/w{3}/等价。{3,6}将【匹配3、4、5或6次。{3,}匹配3次或更多次。 7.14、?等同于{0,1}。*等同于{0,}+则等同于{1,}。 7.15、如果只有一个量词,则趋向于进行贪婪性的匹配,即匹配尽可能多的重复直至达到上限。如果这个量词还有一个额外的后缀?,那么则趋向于进行懒惰性匹配,即试图匹配尽可

中文文本挖掘预处理流程总结

中文文本挖掘预处理流程总结 2017-09-22 12:14 编程派 0 0 阅读 15 作者:刘建平 来源:https://www.sodocs.net/doc/1d19074937.html,/pinard/p/6744056.html 在对文本做数据分析时,我们一大半的时间都会花在文本预处理上,而中文和英文的预处理流程稍有不同,本文就对中文文本挖掘的预处理流程做一个总结。 1. 中文文本挖掘预处理特点 首先我们看看中文文本挖掘预处理和英文文本挖掘预处理相比的一些特殊点。 首先,中文文本是没有像英文的单词空格那样隔开的,因此不能直接像英文一样可以直接用最简单的空格和标点符号完成分词。所以一般我们需要用分词算法来完成分词,在文本挖掘的分词原理中,我们已经讲到了中文的分词原理,这里就不多说。 第二,中文的编码不是utf8,而是unicode。这样会导致在分词的时候,和英文相比,我们要处理编码的问题。 这两点构成了中文分词相比英文分词的一些不同点,后面我们也会重点讲述这部分的处理。当然,英文分词也有自己的烦恼,这个我们在以后再讲。了解了中文预处理的一些特点后,我们就言归正传,通过实践总结下中文文本挖掘预处理流程。 2. 中文文本挖掘预处理一:数据收集 在文本挖掘之前,我们需要得到文本数据,文本数据的获取方法一般有两种:使用别人做好的语料库和自己用爬虫去在网上去爬自己的语料数据。 对于第一种方法,常用的文本语料库在网上有很多,如果大家只是学习,则可以直接下载下来使用,但如果是某些特殊主题的语料库,比如"机器学习"相关的语料库,则这种方法行不通,需要我们自己用第

对于第二种使用爬虫的方法,开源工具有很多,通用的爬虫我一般使用beautifulsoup。但是我们我们需要某些特殊的语料数据,比如上面提到的"机器学习"相关的语料库,则需要用主题爬虫(也叫聚焦爬虫)来完成。这个我一般使用ache。 ache允许我们用关键字或者一个分类算法来过滤出我们需要的主题语料,比较强大。 3. 中文文本挖掘预处理二:除去数据中非文本部分 这一步主要是针对我们用爬虫收集的语料数据,由于爬下来的内容中有很多html的一些标签,需要去掉。少量的非文本内容的可以直接用Python的正则表达式(re)删除, 复杂的则可以用beautifulsoup来去除。去除掉这些非文本的内容后,我们就可以进行真正的文本预处理了。 4. 中文文本挖掘预处理三:处理中文编码问题 由于Python2不支持unicode的处理,因此我们使用Python2做中文文本预处理时需要遵循的原则是,存储数据都用utf8,读出来进行中文相关处理时,使用GBK之类的中文编码,在下面一节的分词时,我们再用例子说明这个问题。 5. 中文文本挖掘预处理四:中文分词 常用的中文分词软件有很多,个人比较推荐结巴分词。安装也很简单,比如基于Python的,用"pip install jieba"就可以完成。下面我们就用例子来看看如何中文分词。 首先我们准备了两段文本,这两段文本在两个文件中。两段文本的内容分别是nlp test0.txt和 nlp test2.txt: 1. 沙瑞金赞叹易学习的胸怀,是金山的百姓有福,可是这件事对李达康的触动很大。易学习又回忆起他们三人分开的前一晚,大家一起喝酒话别,易 学习被降职到道口县当县长,王大路下海经商,李达康连连赔礼道歉,觉得对不起大家,他最对不起的是王大路,就和易学习一起给王大路凑了5万块钱,王大路自己东挪西撮了5万块,开始下海经商。没想到后来王大路竟然做得风生水起。沙瑞金觉得他们三人,在困难时期还能以沫相助,很不容易。 沙瑞金向毛娅打听他们家在京州的别墅,毛娅笑着说,王大路事业有成之后,要给欧阳菁和她公司的股权,她们没有要,王大路就在京州帝豪园买了三套别墅,可是李达康和易学习都不要,这些房子都在王

awk正则表达式介绍

awk命令详解 简单使用: awk :对于文件中一行行的独处来执行操作。 awk -F :'{print $1,$4}' :使用‘:’来分割这一行,把这一行的第一第四个域打印出来。 详细介绍: AWK命令介绍 awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,awk抽取信息 后,才能进行其他文本操作,完整的awk脚本通常用来格式化文本文件中的信息 1.调用awk: 第一种命令行方式,如: awk [-Field-separator] 'commands' input-file(s) 这里commands是真正的awk命令,[-F域分隔符]是可选的,awk默认使用空格分隔, 因此如果要浏览域间有空格的文本,不必指定这个选项,但如果浏览如passwd文件,此文件 各域使用冒号作为分隔符,则必须使用-F选项: awk -F : 'commands' input-file 第二种,将所有awk命令插入一个文件,并使awk程序可执行,然后用awk命令解释器作为脚 本的首行,以便通过键入脚本名称来调用它 第三种,将所有awk命令插入一个单独文件,然后调用,如: awk -f awk-script-file input-file -f选项指明在文件awk-script-file的awk脚本,input-file是使用awk进行浏览 的文件名 2.awk脚本: awk脚本由各种操作和模式组成,根据分隔符(-F选项),默认为空格,读取的内容依次放置到 对应的域中,一行一行记录读取,直到文件尾 2.1.模式和动作

任何awk语句都是由模式和动作组成,在一个awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。动作即对数据进行的操作,如果省去模式部分,动作将时刻保持执行状态 模式可以是任何条件语句或复合语句或正则表达式,模式包含两个特殊字段BEGIN和END,使用BEGIN语句设置计数和打印头,BEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行;END语句用来在awk完成文本浏览动作后打印输出文本总数和结尾状态标志,有动作必须使用{}括起来 实际动作在大括号{}内指明,常用来做打印动作,但是还有更长的代码如if和循环looping 语句及循环退出等,如果不指明采取什么动作,awk默认打印出所有浏览出的记录 2.2.域和记录: awk执行时,其浏览标记为$1,$2...$n,这种方法称为域标记。使用$1,$3表示参照第1和第3域,注意这里使用逗号分隔域,使用$0表示使用所有域。例如: awk '{print $0}' temp.txt > sav.txt 表示打印所有域并把结果重定向到sav.txt中 awk '{print $0}' temp.txt|tee sav.txt 和上例相似,不同的是将在屏幕上显示出来 awk '{print $1,$4}' temp.txt 只打印出第1和第4域 awk 'BEGIN {print "NAME GRADE\n----"} {print $1"\t"$4}' temp.txt 表示打信息头,即输入的内容的第一行前加上"NAME GRADE\n-------------",同时内容以tab分开 awk 'BEGIN {print "being"} {print $1} END {print "end"}' temp 同时打印信息头和信息尾 2.3.条件操作符: <、<=、==、!=、>=、~匹配正则表达式、!~不匹配正则表达式

Delphi 正则表达式

Delphi 正则表达式语法(1): 关于大小写与中文 //替换一般字符串 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '我爱DELPHI, 但Delphi不爱我!'; reg.RegEx := 'Delphi'; reg.Replacement := '◆'; reg.ReplaceAll; ShowMessage(reg.Subject); //返回: 我爱DELPHI, 但◆不爱我! FreeAndNil(reg); end; //不区分大小写 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := '我爱DELPHI, 但Delphi不爱我!'; reg.RegEx := 'Delphi'; reg.Replacement := '◆'; reg.Options := [preCaseLess]; //不区分大小的设定, 默认是区分的 reg.ReplaceAll; ShowMessage(reg.Subject); //返回: 我爱◆, 但◆不爱我! FreeAndNil(reg);

reg.ReplaceAll; ShowMessage(reg.Subject); //返回: ◆◆DELPHI, ◆Delphi◆◆◆! FreeAndNil(reg); end; //我测试了不同的汉字, 除了乱以外,没有规律; 所有如果操作汉字暂时不要指定 preCaseLess Delphi 正则表达式语法(2): 或者与重复 // | 号的使用, | 是或者的意思 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg.Subject := 'CodeGear Delphi 2007'; reg.RegEx := 'e|Delphi|0'; //使用了 | 记号 reg.Replacement := '◆'; reg.ReplaceAll; ShowMessage(reg.Subject); //返回: Cod◆G◆ar ◆ 2◆◆7 FreeAndNil(reg); end; // + 的使用, + 是重复 1 个或多个 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil);

正则表达式

多少年来,许多的编程语言和工具都包含对正则表达式的支持,.NET基础类库中包含有一个名字空间和一系列可以充分发挥规则表达式威力的类,而且它们也都与未来的Perl 5中的规则表达式兼容。 此外,regexp类还能够完成一些其他的功能,例如从右至左的结合模式和表达式的编辑等。 在这篇文章中,我将简要地介绍System.Text.RegularExpression中的类和方法、一些字符串匹配和替换的例子以及组结构的详细情况,最后,还会介绍一些你可能会用到的常见的表达式。 应该掌握的基础知识 规则表达式的知识可能是不少编程人员“常学常忘”的知识之一。在这篇文章中,我们将假定你已经掌握了规则表达式的用法,尤其是Perl 5中表达式的用法。.NET的regexp类是Perl 5中表达式的一个超集,因此,从理论上说它将作为一个很好的起点。我们还假设你具有了C#的语法和.NET架构的基本知识。 如果你没有规则表达式方面的知识,我建议你从Perl 5的语法着手开始学习。在规则表达式方面的权威书籍是由杰弗里?弗雷德尔编写的《掌握表达式》一书,对于希望深刻理解表达式的读者,我们强烈建议阅读这本书。 RegularExpression组合体 regexp规则类包含在System.Text.RegularExpressions.dll文件中,在对应用软件进行编译时你必须引用这个文件,例如: csc r:System.Text.RegularExpressions.dll foo.cs 命令将创建foo.exe文件,它就引用了System.Text.RegularExpressions文件。 名字空间简介 在名字空间中仅仅包含着6个类和一个定义,它们是: Capture: 包含一次匹配的结果; CaptureCollection: Capture的序列; Group: 一次组记录的结果,由Capture继承而来; Match: 一次表达式的匹配结果,由Group继承而来; MatchCollection: Match的一个序列; MatchEvaluator: 执行替换操作时使用的代理; Regex: 编译后的表达式的实例。 Regex类中还包含一些静态的方法: Escape: 对字符串中的regex中的转义符进行转义; IsMatch: 如果表达式在字符串中匹配,该方法返回一个布尔值; Match: 返回Match的实例; Matches: 返回一系列的Match的方法; Replace: 用替换字符串替换匹配的表达式; Split: 返回一系列由表达式决定的字符串; Unescape:不对字符串中的转义字符转义。

正则表达式

要想真正的用好正则表达式,正确的理解元字符是最重要的事情。下表列出了所有的元字符和对它们的一个简短的描述。 字符描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“\n”匹配字符“n”。“\\n”匹配一个换行符。序列“\\”匹配“\”而“\(”则匹配“(”。 ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。 $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。 * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,“z o+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。 ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“d o”。?等价于{0,1}。 {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。 {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“fo o o ood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。 {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o?”将匹配单个“o”,而“o+”将匹配所有“o”。 点匹配除“\n”之外的任何单个字符。要匹配包括“\n”在内的任何字符,请使用像“[\s\S]”的模式。

[VIP专享]经典正则表达式QRegExp的解析

QRegExp正则表达式 2010-03-20 17:00 "^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" //非正整数(负整数 + 0) "^-[0-9]*[1-9][0-9]*$" //负整数 "^-?\d+$" //整数 "^\d+(\.\d+)?$" //非负浮点数(正浮点数 + 0) "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$" //正浮点数 "^((-\d+(\.\d+)?)|(0+(\.0+)?))$" //非正浮点数(负浮点数 + 0) "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0- 9]*[1-9][0-9]*)))$" //负浮点数 "^(-?\d+)(\.\d+)?$" //浮点数 "^[A-Za-z]+$" //由26个英文字母组成的字符串 "^[A-Z]+$" //由26个英文字母的大写组成的字符串 "^[a-z]+$" //由26个英文字母的小写组成的字符串 "^[A-Za-z0-9]+$" //由数字和26个英文字母组成的字符串 "^\w+$" //由数字、26个英文字母或者下划线组成的字符串 "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$" //email地址 "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$" //url "^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$" // 年-月-日 "^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$" // 月/日/年 "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Email "(d+-)?(d{4}-?d{7}|d{3}-?d{8}|^d{7,8})(-d+)?" //电话号码 "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0- 5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$" //IP地址 ^([0-9A-F]{2})(-[0-9A-F]{2}){5}$ //MAC地址的正则表达式 ^[-+]?\d+(\.\d+)?$ //值类型正则表达式 QRegExp是Qt的正则表达式类. Qt中有两个不同类的正则表达式. 第一类为元字符.它表示一个或多个常量表达式. 令一类为转义字符,它代表一个特殊字符. 一.元字符 . 匹配任意单个字符.例如, 1.3 可能是1. 后面跟任意字符,再跟3

sed_4.2.1_man_中文

本文参照sed 4.2.1的man原文翻译。蓝色字体为man原文,黑色字体是我的译文。 水平有限,难免错漏,欢迎各位指正! GNU文档的精髓在info页,而不是man页。 当然更希望有同仁将sed的info页翻译出来,方便大家更扎实地运用好sed这个功能强大的工具。 翻译者:李启训。 NAME 名称 sed - stream editor for filtering and transforming text 用于过滤和转换文本的流编辑器。 SYNOPSIS 提要 sed [OPTION]... {script-only-if-no-other-script} [input-file]... DESCRIPTION 描述 Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors. Sed 是一个流编辑器。流编辑器用于转换输入流(文件或者来自管道)的基本文本。虽然在某些方面它类似于允许脚本编辑的编辑器(比如ed),但是sed只对一次传递的输入进行操作,当然更加高效。除此以外,因为sed能够过滤来自管道中的文本,这明显区别于其他类型的编辑器。 -n, --quiet, --silent suppress automatic printing of pattern space 抑制模式空间的自动输出。 -e script, --expression=script add the script to the commands to be executed 添加脚本给命令,以便执行。 -f script-file, --file=script-file add the contents of script-file to the commands to be executed 添加脚本文件的内容,以便执行。 --follow-symlinks follow symlinks when processing in place 就地处理时跟随符号链接。 -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied) 就地编辑文件(如果提供扩展,则备份文件)。 -l N, --line-length=N specify the desired line-wrap length for the `l' command 为l命令指定所预期的行的长度。 --posix disable all GNU extensions. 禁用所有GNU扩展。 -r, --regexp-extended use extended regular expressions in the script. 在脚本中使用扩展正则表达式。 -s, --separate consider files as separate rather than as a single continuous

很完整的一篇正则表达式总结

1、正则表达式-完结篇---工具类开发--- ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 '/.+/', 'email'=> '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', 'url'=> '/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(?:[\/ \?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/', 'currency'=> '/^\d+(\.\d+)?$/', 'number'=> '/^\d+$/', 'zip'=> '/^\d{6}$/', 'integer'=> '/^[-\+]?\d+$/', 'double'=> '/^[-\+]?\d+(\.\d+)?$/',

5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2'english'=> '/^[A-Za-z]+$/', 'qq'=> '/^\d{5,11}$/', 'mobile'=> '/^1(3|4|5|7|8)\d{9}$/', ); //定义其他属性 private$returnMatchResult=false; //返回类型判断 private$fixMode=null; //修正模式 private$matches=array(); //存放匹配结果 private$isMatch=false; //构造函数,实例化后传入默认的两个参数 public function __construct($returnMatchResult=false,$fixMode=null){ $this->returnMatchResult=$returnMatchResult; $this->fixMode=$fixMode; } //判断返回结果类型,为匹配结果matches还是匹配成功与否isMatch,并调用返回方法 private function regex($pattern,$subject){ if(array_key_exists(strtolower($pattern), $this->validate)) $pattern=$this->validate[$pattern].$this->fixMode; //判断后再连接上修正模式作为匹配的正则表达式 $this->returnMatchResult ?

语法词法生成器

语法词法生成器 一、语法词法生成器Flex 语法扫描器生成器 flex (fast lexical analyser generator) 是Lex的另一个替代品。它经常和自由软件Bison语法分析器生成器一起使用。Flex 最初由Vern Paxson 于1987 年用C语言写成。语法分析生成器JavaCC JavaCC(Java Compiler Compiler) 是一个用JA V A开发的最受欢迎的语法分析生成器。这个分析生成器工具可以读取上下文无关且有着特殊意义的语法并把它转换成可以识别且匹 配该语法的JA VA程序。它还提供JJTree等工具来...语法分析器生成工具YACC 这是一个经典的生成语法分析器的工具,大学的《编译原理》课程里介绍过。词法分析工具ANTLR ANTLR(ANother Tool for Language Recognition)它是Java开发的词法分析工具,它可以接受词文法语言描述,并能产生识别这些语言的语句的程序。作为翻译程序的一部分,你可以使用简单的操作符和动作来参数化你的文法...解析器生成器

Bison GNU bison是一个自由软件,用于自动生成语法分析器程序,实际上可用于所有常见的操作系统。Bison把LALR形式的上下文无关文法描述转换为可做语法分析的C或C++程序。在新近版本中,Bison增加了对GLR语法分析算法的支...词法分析器生成工具Lex 这是一个经典的生成词法分析器的工具语法分析器生成工 具Berkeley Yacc Berkeley Yacc (byacc) 是一个高质量的yacc 变种,其目的是为了避免依赖某个特定的编译器。语法分析生成器JFlex JFlex是一个Java的词法/语法分析生成器。JavaScript解析器Jison JavaScript解析器,Coffee就是使用Jison解析的。Jison 将一个上下文无关语法作为输入,输出对应的JavaScript代码,类似Yacc。词法/语法分析框架chrysanthemum chrysanthemum (中文名“菊花”)是一个由C++写成的小巧

正则表达式 (1)

正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。 列目录时,dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。 正则表达式是由普通字符(例如字符a 到z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 3.1 普通字符 由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。 3.2 非打印字符 字符含义 \cx 匹配由x指明的控制字符。例如,\cM 匹配一个Control-M 或回车符。x 的值必须为A-Z 或a-z 之一。否则,将c 视为一个原义的‘c’ 字符。 \f 匹配一个换页符。等价于\x0c 和\cL。 \n 匹配一个换行符。等价于\x0a 和\cJ。 \r 匹配一个回车符。等价于\x0d 和\cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于\x09 和\cI。 \v 匹配一个垂直制表符。等价于\x0b 和\cK。

3.5 定位符 用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。 3.6 选择 用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。 其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。 3.7 后向引用 对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从1 开始,连续编号直至最大99 个子表达式。每个缓冲区都可以使用‘\n’ 访问,其中n 为一个标识特定缓冲区的一位或两位十进制数。 可以使用非捕获元字符‘?:’, ‘?=’, or ‘?!’ 来忽略对相关匹配的保存。 4. 各种操作符的运算优先级 相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下: 操作符描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \anymetacharacter 位置和顺序 | “或”操作 5. 全部符号解释

常用正则表达式

1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用: 2. "^\d+$"//非负整数(正整数+ 0) 3. "^[0-9]*[1-9][0-9]*$"//正整数 4. "^((-\d+)|(0+))$"//非正整数(负整数+ 0) 5. "^-[0-9]*[1-9][0-9]*$"//负整数 6. "^-?\d+$"//整数 7. "^\d+(\.\d+)?$"//非负浮点数(正浮点数+ 0) 8. "^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"//正浮点数 9. "^((-\d+(\.\d+)?)|(0+(\.0+)?))$"//非正浮点数(负浮点数+ 0) 10. "^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"//负浮点数 11. "^(-?\d+)(\.\d+)?$"//浮点数 12. "^[A-Za-z]+$"//由26个英文字母组成的字符串 13. "^[A-Z]+$"//由26个英文字母的大写组成的字符串 14. "^[a-z]+$"//由26个英文字母的小写组成的字符串 15. "^[A-Za-z0-9]+$"//由数字和26个英文字母组成的字符串 16. "^\w+$"//由数字、26个英文字母或者下划线组成的字符串 17. "^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"//email地址 18. "^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"//url 19. /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日 20. /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年 21. "^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$" //Emil 22. /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码 23. "^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}| 1dd|2[0-4]d|25[0-5])$" //IP地址 24. 25. 匹配中文字符的正则表达式:[\u4e00-\u9fa5] 26. 匹配双字节字符(包括汉字在内):[^\x00-\xff] 27. 匹配空行的正则表达式:\n[\s| ]*\r 28. 匹配HTML标记的正则表达式:/<(.*)>.*<\/\1>|<(.*) \/>/ 29. 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 30. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)* 31. 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$ 32. 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 33. 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})? 34. 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$ 35. 36. 37. 元字符及其在正则表达式上下文中的行为:

相关主题