您的浏览器过于古老 & 陈旧。为了更好的访问体验, 请 升级你的浏览器
Ready 发布于2013年02月08日 01:02

原创 正则表达式语法入门详解

2845 次浏览 读完需要≈ 20 分钟 正则表达式JavaScript

内容目录

为什么需要正则表达式

作为编程开发技术爱好者,在我们使用计算机的过程中,几乎都有类似如下的经历:

  • 查找文件夹中指定后缀的文件,例如查找所有txt后缀的文件。
  • 检查用户输入的内容是否全部为数字。
  • 验证用户输入的邮箱格式是否有效。
  • 验证用户输入的用户名必须由6-16位的大小写英文字母、数字或下划线“_”组成。
  • 将文本中两位及以上的数字前面全部加上美元符号“$”。
  • 获取文本文件中所有前面带有“$”符号的金额数字。

以上面的第一种情况为例,相信大多数读者都知道,只要在Windows搜索框中输入“*.txt”即可找到指定文件夹下所有的txt文件。不过下面的几个例子看起来就并不好解决了,即使能够解决,也需要写比较多的代码才能完成。那么我们有没有一种更简单的解决方式呢?答案当然是肯定的,更简单的解决方案就是采用正则表达式(Regular Expression)。

正则表达式简介

简单地说,正则表达式就是用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串,它的用法和我们前面例子中的“*.txt”非常相似。不过,它的功能要比后者要强大得多。使用正则表达式,我们可以非常方便地查找或替换那些符合某种特定规则的文本内容。由于其功能强大,使用起来简单灵活,因此,诸如Java、PHP、C#、C++、JavaScript等许多程序设计语言都支持使用正则表达式进行字符串操作。需要注意的是,在不同的语言中,正则表达式的标准语法都是一样的,但是使用方法却有所不同,本文只介绍正则表达式的语法部分,具体操作方法将会在其他相关文章中介绍(为了方便不同编程语言的开发人员进行学习测试,本文都以JavaScript中的正则表达式使用方法为例)。

正则表达式通配符

在Windows中使用“*.txt”查找txt文件,这里的“*.txt”其实是文件名的一个模板,意思是在文件夹中查找所有文件名符合*.txt”这种格式的文件。前面的特殊符号“*”表示0个到多个任意字符,这种具有指定含义的特殊符号,我们一般叫做通配符。

正则表达式也是采用类似的方式来查找或替换内容,我们利用正则表达式规定的一些通配符,并组成一个格式字符串,然后在需要查找或替换的文本内容中依次去匹配符合这种格式的文本,这样就能够找到我们所需要的文本。接下来,我们就可以根据自己的意愿来决定如何处理它(替换或者删除等)。例如,在正则表达式中,通配符\d表示一个0-9之间任意的数字,如果我们需要用户只输入一个数字,就不需要自己去判断这个字符是否为0-9。

<html>
<head>
	<title>正则表达式学习教程示例1</title>
</head>
<body>
<script type="text/javascript">
var inputText = "1";	//输出的字符串
var regex = /\d/;	//表示包含一个数字的正则表达式
if(regex.test(inputText)){	//调用Javascript正则表达式对象的test()函数,验证输入的内容是否与正则表达式匹配
	alert("输入正确!");
}else{
	alert("输入错误!");
}
</script>
</body>
</html>

除此之外,正则表达式还有一系列通配符来表示特定的含义,比如:\s表示一个任意的空白字符,\w表示一个包含下划线在内的任意单词字符(即:A-Z、a-z、0-9、_)。正则表达式的主要通配符及相关说明详见下表(通配符区分大小写,常用部分用红色标记):

通配符 说明
. 匹配除“\n”外的任意一个字符
\b 匹配一个字边界,即字与空格间的位置。
\B 匹配“\b”之外的任意字符。
\d 匹配0-9的任意一个数字。
\D 匹配“\d”之外的任意字符。
\f 匹配换页符。
\n 匹配换行符。
\r 匹配回车符。
\s 匹配任何空白字符(包括空格、制表符、换页符、换行符等)
\S 匹配任何非空白字符。
\t 匹配制表符。
\v 匹配垂直制表符。
\w 匹配包括下划线在内的任意单词字符(包括A-Z、a-z、0-9、_)。
\W 匹配“\w”之外的所有字符。
^ 匹配字符串开始的位置。
$ 匹配字符串结束的位置。

通过上述内容我们知道,如果我们需要用户在注册账号时,只能输入单词字符(A-Z、a-z、0-9、_),那么我们直接使用通配符\w即可,而无需再判断一个个字符是否为字母、数字或下划线。

<html>
<head>
	<title>正则表达式学习教程示例2</title>
</head>
<body>
<script type="text/javascript">
var inputText = "B";	//输出的字符串
var regex = /\w/;	//表示包含一个单词字符的正则表达式
if(regex.test(inputText)){	//调用Javascript正则表达式对象的test()函数,验证输入的内容是否与正则表达式匹配
	alert("输入正确!");
}else{
	alert("输入错误!");
}
</script>
</body>
</html>

通配符组合

聪明的你应该知道,在JavaScript中,使用/正则表达式内容/的格式来表明这是一个正则表达式,就像在许多编程语言中,使用双引号包含一串文本内容来表明这是一个字符串一样。JavaScript正则表达式对象的test()方法用来验证字符串是否匹配指定的正则表达式,如果匹配就返回true,否则返回false

在上面的示例1中,如果我们输入一个数字0-9,将会提示输入正确。不过,稍微细心一点的话,我们还会发现,即使我们输入A0z123abc9等内容,仍然会提示输入正确。很明显这并不符合我们的需求,这到底是怎么一回事呢?

其实,在正则表达式中,使用/\d/去匹配字符串,只要字符串中包含任意一个数字,那么它们就是匹配的。也就是说,只要字符串中有一部分能够完全匹配指定的正则表达式,那么它们就是匹配的。

如果我们只想匹配唯一的一个数字,那么该怎么办呢?这个时候,我们就需要定义一个正则表达式,让它只能够与一个数字匹配,多了其他任何内容都不行。于是,我们就可以如下编写正则表达式:

<html>
<head>
<title>正则表达式学习教程示例3</title>
</head>
<body>
<script type="text/javascript">
var inputText = "9"; //输出的字符串
var regex = /^\d$/;  //表示一个数字的正则表达式
if(regex.test(inputText)){  //调用Javascript正则表达式对象的test()函数,验证输入的内容是否与正则表达式匹配
	alert("输入正确!");
}else{
	alert("输入错误!");
}
</script>
</body>
</html>

参考上面的通配符说明,我们知道,正则表达式/^\d$/中的^表示字符串的开头位置,\d表示任意一个数字,$表示字符串的结束位置。一个数字既挨着字符串的开头位置,又紧邻字符串的结尾位置,那就说明这个字符串只有这一个数字。

当然,在多数情况下,我们一般不只匹配一个字符,例如常见的网站账号、QQ号、手机号、电话号码、身份证号码等都包含多个字母或数字。有些网站在注册账号时要求用户输入的用户名必须为6-16位的字母、数字或下划线。这个时候,我们就可以编写如下正则表达式进行验证:

<html>
<head>
<title>正则表达式学习教程示例4</title>
</head>
<body>
<script type="text/javascript">
var inputText = "hello2013";    //输出的字符串
var regex = /^\w{6,16}$/;   //表示6-16位字母、数字、下划线的正则表达式
if(regex.test(inputText)){  //调用Javascript正则表达式对象的test()函数,验证输入的内容是否与正则表达式匹配
	alert("输入正确!");
}else{
	alert("输入错误!");
}
</script>
</body>
</html>

正则表达式/^\w{6,16}$/中的{6,16}表示其前面的字符或子表达式需要连续匹配6-16次,也就是匹配6-16个\w。此外,正则表达式还提供以下组合来匹配指定内容。

元字符 说明
{n,m} m和n是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。
例如,“a{5,8}”匹配5-8个a。
注意:逗号和数字之间不能有空格。
{n,} n 是非负整数。至少匹配n次。
例如,“c{5,}”匹配5到无限个c。
{n} n 是非负整数。正好匹配 n 次。
例如,“123{3}”匹配“12333”;“(456){2}”匹配“456456”
* 零次或多次匹配前面的字符或子表达式。
例如,“zx*” 可以匹配“z”后面跟0到无数个“x”(“z”或“zxx”皆可)。
*等效于{0,}。
? 零次或一次匹配前面的字符或子表达式。
?等效于{0,1}。
+ 一次或多次匹配前面的字符或子表达式。
+等效于{1,}。
x|y 匹配 x 或 y。
例如,“g|food” 匹配“z”或“food”。“(g|f)ood” 匹配“good”或“food”。
[xyz] 字符集。匹配包含的任一字符。
例如,“[abc]”匹配“a”、“b”、“c”之中的任何一个字符。
[^xyz] 反向字符集。匹配未包含的任何字符。
例如,“[^abc]”匹配除“a”“b”“c”之外的任何字符。
[a-z] 字符范围。匹配指定范围内的任何字符。
例如,“[a-z]”匹配a到z范围内的任何小写字母;“[A-G]”匹配A到G范围内的任何大写字母。“[0-9]”匹配0到9之间的任意数字(相当于“\d”)。
[^a-z] 反向范围字符。匹配不在指定的范围内的任何字符。
例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符。

(未完待续)

  • CodePlayer技术交流群1
  • CodePlayer技术交流群2

0 条评论

撰写评论