JavaScript、Java正则表达式详解_第1页
JavaScript、Java正则表达式详解_第2页
JavaScript、Java正则表达式详解_第3页
JavaScript、Java正则表达式详解_第4页
JavaScript、Java正则表达式详解_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

JavaScript、Java正则表达式详解什么是正则表达式?正则表达式(Regular

Expression)就是用某种模式去匹配一类字符串的公式。如你要在一篇文章中查找第一个字是“罗”最后一个字是“浩”的三个字的姓名,即“罗*浩”;那么“罗*浩”就是公式,也称作模式(Pattern),这篇文章就是要匹配的串(或叫文本text)。再如,你要检查输入的一个字符串是否是126邮箱的格式,你得制定一个规则去查检,这种规则就是正则表达式。从入门开始我们就从上面提到的一个例子开始:检查一个字符串是否符合126邮箱的格式。我们从网易的邮箱注册页面可以看到126邮箱的用户名需要符合以下的格式:6~18个字符,可使用字母、数字、下划线,需以字母开头。我们可以定义一个模式:^[a-zA-Z]\w{5,17}@126.com

这个模式可以这样理解:[a-zA-Z]:任何一个a到z或A到Z的英文字母^:

表示以什么开头,则^[a-zA-Z]表示以字母开头\w:

单词字符[a-zA-Z_0-9],即a-z或A-Z或0-9或_中的任何一个字符{5,17}:

表示出现5到17次(至少5次,不超过17次),则\w{5,17}表示5~17个字符。

因为还有一个以非数字字母开头的字符,所以^[a-zA-Z]\w{5,17}表示:“6~18个字符,可使用字母、数字、下划线,需以字母开头”@126.com:表示符合以上规则的用户名后跟上@126.com字符串,即组成一个邮箱地址。

“^[a-zA-Z]\w{5,17}@126.com”就是我们所说的正则表达式,用Java的简单实现如下:[javascript]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?String

regex

=

"^[a-zA-Z]\\w{5,17}@126\\.com";

//定义匹配的规则:正则表达式

//说明:126.com中的.需要转义\\.

String

text

=

"ZhanSan@126fcom";

//要检查的字符串

boolean

isMatched

=

text.matches(regex);

//判断text是否符合规则regex

System.out.println(isMatched);

正则表达式常用符号上面一个示例中用到的“^”、“\w”、“{5,17}”等都是正则表达式中的常用符号,这些符号在正则表达式中都有特殊的含意。下面这个表格是Java中的正则表达式常用符号的含意(只抽取了其常用的部分进行说明,就这些部分其实可以解决关于正则表达式的绝大多数的问题了)。模式匹配的内容(含意)

字符类[abc]a、b

c(简单类)[^abc]任何字符,除了

a、b

c(否定)[a-zA-Z]a

z

A

Z,两头的字母包括在内(范围)[a-d[m-p]]a

d

m

p:[a-dm-p](并集)[a-z&&[def]]d、e

f(交集)[a-z&&[^bc]]a

z,除了

b

c:[ad-z](减去)[a-z&&[^m-p]]a

z,而非

m

p:[a-lq-z](减去)

预定义字符类.任何字符(与行结束符可能匹配也可能不匹配)\d数字:[0-9]\D非数字:

[^0-9]\s空白字符:[

\t\n\x0B\f\r]\S非空白字符:[^\s]\w单词字符:[a-zA-Z_0-9]\W非单词字符:[^\w]

边界匹配器^行的开头$行的结尾\b单词边界\B非单词边界\A输入的开头\G上一个匹配的结尾\Z输入的结尾,仅用于最后的结束符(如果有的话)\z输入的结尾

数量词(Greedy策略)X?X,一次或一次也没有X*X,零次或多次X+X,一次或多次X{n}X,恰好

n

次X{n,}X,至少

n

次X{n,m}X,至少

n

次,但是不超过

m

逻辑运算符XYX

后跟

YX|YX

Y(X)X,作为捕获组参考文档:Class

Pattern

这些常用的符号在各种编程语言的正则表达式中含意基本相同(因为正则表达式的思想是相同的),所以都可以用来参数。但不同的语言可能会有一些细小的差别,如果要针对各种编程语言,想有更精确和权威的说明,可参考其官方文档:C++(VS2013编译器):/zh-cn/library/bb982727.aspx#grammarsummaryJava:

/javase/7/docs/api/java/util/regex/Pattern.htmlJavaScript:

/jsref/jsref_obj_regexp.asp

正则表达式的使用下面从常见的需求出发讲述C++、Java和JavaScript中正则表达式的使用C++中的正则表达式C++中正则表达式主要有三种实现方式:C语言的实现方式(C

regex),C++标准库的实现(C++

regex),Boost库的实现(boost

regex)。C

regex的方式是一种面向过程的编程方式,使用起来不太方便;C++

regex的方式因为是标准库的一部分,所以可以直接使用(好像Linux平台下不支持),但C++

regex非常难用,语法要求比较严格,而且好多默认的选项和我们正常的想法不一样;Boost是一个开源的第三方库,这个库非常优秀,广泛应用于C++的项目开发中,boost

regex非常灵活好用,C++开发时是大家推崇的一种方式。关于boost

regex的用法,在后继的文章将会进一步介绍,现在以C++

regex的方式列举一个使用样例。1.验证ip地址[cpp]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?#include

<regex>

#include

<iostream>

#include

<string>

bool

IsIpV4Address(const

std::string&

strIp)

{

//验证IP地址的模式,这里"\."中的"\"是转义字符,表示这是一个.

const

std::regex

pattern("(\\d{1,3}){1}\.(\\d{1,3}){1}\.(\\d{1,3}){1}\.(\\d{1,3}){1}");

//匹配验证

return

std::regex_match(strIp,

pattern);

}

int

main()

{

std::string

strIp1

=

"";//

std::string

strIp2

=

"192.168.255";

std::cout

<<

strIp1

<<

"

:

"

<<

(IsIpV4Address(strIp1)

?

"valid"

:

"invalid")

<<

std::endl;

std::cout

<<

strIp2

<<

"

:

"

<<

(IsIpV4Address(strIp2)

?

"valid"

:

"invalid")

<<

std::endl;

return

0;

}

Java中的正则表达式1.验证一个字符串是否为URL[java]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?public

static

boolean

isUrl(String

text)

{

String

regex

=

"^http://([\\w-]+.)+[\\w-]+(/[\\w-./?%&=#]*)?$";

return

text.matches(regex);

}

2.判断一个文本中有多少个URL,并将所有的URL加上超链接.如以下文本:C++(VS2013编译器):/zh-cn/library/bb982727.aspx#grammarsummaryJava:

/javase/7/docs/api/java/util/regex/Pattern.htmlJavaScript:

/jsref/jsref_obj_regexp.asp添加链接后变成:C++(VS2013编译器):<a

href=”/zh-cn/library/bb982727.aspx#grammarsummary”>/zh-cn/library/bb982727.aspx#grammarsummary</a>Java:

<a

href=”/javase/7/docs/api/java/util/regex/Pattern.html”>/javase/7/docs/api/java/util/regex/Pattern.html</a>JavaScript:

<a

href=”/jsref/jsref_obj_regexp.asp”>/jsref/jsref_obj_regexp.asp</a>

[java]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?/**

*

给一个字符串添加链接

*

@param

text

要添加链接的字符串

*

@param

url

链接的URL

*

@return

添加链接后的字符串

*/

public

static

String

AddHref(String

text,

String

url)

{

return

"<a

href=\""

+

url

+

"\">"

+

text

+

"</a>";

}

/**

*

查找文本中的URL字符串,并将其添加链接

*

@param

text

需要查找的文本

*

@return

添加链接后的文本

*/

public

static

String

AddLinkToText(String

text)

{

Pattern

pattern

=

Ppile("http://([\\w-]+.)+[\\w-]+(/[\\w-./?%&=#]*)?");

Matcher

matcher

=

pattern.matcher(text);

StringBuffer

sb

=

new

StringBuffer();

//定义一个字符缓冲区,用于保存新的文本

while

(matcher.find())

{

String

matchedSubStr

=

matcher.group();

//提取出查找到的子串

matcher.appendReplacement(sb,

AddHref(matchedSubStr,

matchedSubStr));

//将找到的子串添加链接后塞到字符缓冲区内

}

matcher.appendTail(sb);

return

sb.toString();

}

JavaScript中的正则表达式JavaScript中的正则表达式是通过RegExp对象实现的。RegExp对象的创建有三种方式:精简方式:/pattern/attributesnew方式:new

RegExp(pattern,

attributes);函数调用的方式:RegExp(pattern,

attributes);

参数pattern可以是一个模式串,也可以是一个RegExp对象,如果pattern本身就是RegExp的对象,则attributes参数将不起作用(新创建的对象的必发与pattern对象相同。),需要省略,如果不省略会抛TypeError

异常。

参数attributes有三种属性"g"、"i"

"m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。

RegExp主要有三个方法:compile编译正则表达式,可用于改变和重新编译正则表达式。exec检索字符串中指定的值。返回找到的值,并确定其位置。test检索字符串中是否有指定的值。返回

true

false。

1.验证字符串是否为数字[javascript]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script

type="text/javascript">

function

isNumber(text)

{

var

pattern

=

new

RegExp("^\\d*$");

return

pattern.test(text);

}

var

value1

=

"1234";

document.write(value1

+

"

is

Numed:"

+

isNumber(value1));

</script>

2.邮箱格式:[javascript]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script

type="text/javascript">

function

isEmail(text)

{

var

reg

=

/^([\w-.])+@([\w-])+((\.[\w-]{2,3}){1,2})$/;

return

reg.test(text);

}

var

value2

=

"Zhang.San@163.com";

document.write(value2

+

"

is

Email:"

+

isEmail(value2));

</script>

3.将一个文本中的所有邮箱地址和在文本中的位置打印到页面[javascript]

\o"viewplain"viewplain\o"copy"copy\o"print"print\o"?"?<script

type="text/javascript">

function

PrintEmail(text)

{

//匹配的模式

var

reg

=

RegExp("([\\w-.])+@([\\w-])+((\.[\\w-]{2,3}){1,2})",

"g");

var

result;

//保存结果

while

((result

=

reg.exec(text))

!=

null)

{

document.write(result[0]

+

"<br/>"

+

result.index);

document.write("<br/><br/>");

}

}

var

text

=

"张三

Zhang.San@163.com;

李四

Li_si@126.com;王五

WangWu@"

;

PrintEmail(text);

</script>

应用场景数据验证:例如,可以检查输入的字符串,看其是否为电话号码格式,或是否为邮箱格式。

这在网页的表单输入中经常用到。查找子串:可以查找文档内(或一个字符串内)符合指定模式的子串。替换文本:可以使用正则表达式来识别文档中的特定内容,完全删除该部分内容或者用其他字符串来替换它。使用工具:如Word、NotePad++、EditPlus等文字编辑器中的查找功能都支持正则表达式,用正则表达式你就可以实现更加多样化的查找。还有像VS、CodeBlock、Eclipse、Intellij

Idea等开发工具的IDE的查找替换功能也都支持正则表达式,用它你可以修改变量名,调整代码格式,统计代码行数等。

常用正则表达式总结常用的正则表达式已经有很多人做了总结了,在网上能够找到非常多,我就没有再写的必要了。下面贴出我觉得还不错的一个总结。此部分内容为转载,来自:/zxin/archive/2013/01/26/2877765.html

一、校验数字的表达式1数字:^[0-9]*$2n位的数字:^\d{n}$3至少n位的数字:^\d{n,}$4m-n位的数字:^\d{m,n}$5零和非零开头的数字:^(0|[1-9][0-9]*)$6非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$7带1-2位小数的正数或负数:^(\-)?\d+(\.\d{1,2})?$8正数、负数、和小数:^(\-|\+)?\d+(\.\d+)?$9有两位小数的正实数:^[0-9]+(.[0-9]{2})?$10有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$11非零的正整数:^[1-9]\d*$或^([1-9][0-9]*){1,3}$或^\+?[1-9][0-9]*$12非零的负整数:^\-[1-9][]0-9"*$或^-[1-9]\d*$13非负整数:^\d+$或^[1-9]\d*|0$14非正整数:^-[1-9]\d*|0$或^((-\d+)|(0+))$15非负浮点数:^\d+(\.\d+)?$或^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$16非正浮点数:^((-\d+(\.\d+)?)|(0+(\.0+)?))$或^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$17正浮点数:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$或^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$18负浮点数:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$或^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$19浮点数:^(-?\d+)(\.\d+)?$或^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$二、校验字符的表达式1汉字:^[\u4e00-\u9fa5]{0,}$2英文和数字:^[A-Za-z0-9]+$或^[A-Za-z0-9]{4,40}$3长度为3-20的所有字符:^.{3,20}$4由26个英文字母组成的字符串:^[A-Za-z]+$5由26个大写英文字母组成的字符串:^[A-Z]+$6由26个小写英文字母组成的字符串:^[a-z]+$7由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$8由数字、26个英文字母或者下划线组成的字符串:^\w+$或^\w{3,20}$9中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$10中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$或^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$11可以输入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+12禁止输入含有~的字符:[^~\x22]+三、特殊需求表达式1Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$2域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?3InternetURL:[a-zA-z]+://[^\s]*或^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$4手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$5电话号码("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$6国内电话号码021-87888822):\d{3}-\d{8}|\d{4}-\d{7}7身份证号(15位、18位数字):^\d{15}|\d{18}$8短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$或^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$9帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$10密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$11强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$12日期格式:^\d{4}-\d{1,2}-\d{1,2}13一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$14一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$15钱的输入格式:161.有四种钱的表示形式我们可以接受:"10000.00"和"10,000.00",和没有"分"

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论