正则表达式笔记
正则表达式说明:
正则表达式是一种可以用于模式匹配和替换的强有力的工具,可以让用户通过使用一系列的特殊字符构建匹配模式,然后把匹配模式与数据文件、程序输入以及WEB页面的表单输入等目标对象进行比较,根据比较对象中是否包含匹配模式,执行相应的程序。
正则表达式的基本格式:
正则表达式的形式一般如下:
/love/
其中“/”为定界符,位于定界符之间的部分就是将要在目标对象中进行匹配的模式。我们只要把希望查找匹配对象的模式内容放入“/”定界符之间即可。
正则表达式的特殊字符(元字符):
元字符就是指那些在正则表达式中具有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
特别字符 | 说明 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 |
( ) | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 |
* | 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 |
+ | 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 |
. | 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \.。 |
[ | 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 |
? | 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 |
^ | 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。 |
{ | 标记限定符表达式的开始。要匹配 {,请使用 \{。 |
| | 指明两项之间的一个选择。要匹配 |,请使用 \|。 |
1. 较为常用的元字符包括: “+”, “*”,以及 “?”。
其中:
“+”元字符规定其前导字符必须在目标对象中连续出现一次或多次;
“*”元字符规定其前导字符必须在目标对象中出现零次或连续多次;
“?”元字符规定其前导对象必须在目标对象中连续出现零次或一次。
例如:
/ok+/ 表示可以与字母“o”后面有一个或多个字母“k”的字符串相匹配;
/ok*/ 表示可以与字母“o”后面有零个或多个字母“k”的字符串相匹配;
/ok?/ 表示可以与字母“o”后面有零个或一个字母“k”的字符串相匹配。
2. 除了元字符之外,用户还可以精确指定模式在匹配对象中出现的频率。
例如:
/ok{2,8}/ 表示可以与字母“o”后面至少有两个最多有八个字母“k”的字符串相匹配。
3. 另外,还有一些匹配某些同类元素的元字符。
其中:
\s 用于匹配单个空格符,包括tab键和换行符;
\S 用于匹配除单个空格符之外的所有字符;
\d 用于匹配从0到9的数字;
\w 用于匹配字母,数字或下划线字符;
\W 用于匹配所有与\w不匹配的字符;
. 用于匹配除换行符之外的所有字符。
(说明:我们可以把\s和\S以及\w和\W看作互为逆运算)
例如:
/\s+/ 表示可以与包含一个或者多个空格字符的字符串相匹配;
/\d{4}/ 表示可以与所有四位数字的字符串相匹配。
4. 元字符中还包含一类字符,我们称之为“定位符”,包括 “^”, “$”, “\b” 以及 “\B”。
其中:
“^” 规定匹配模式必须出现在目标字符串的开头;
“$” 规定匹配模式必须出现在目标对象的结尾;
“\b” 规定匹配模式必须出现在目标字符串的开头或结尾的两个边界之一;
“\B” 规定匹配对象必须位于目标字符串的开头和结尾两个边界之内,即匹配对象既不能作为目标字符串的开头,也不能作为目标字符串的结尾。
(说明:同样,我们也可以把“^”和“$”以及“\b”和“\B”看作是互为逆运算的两组定位符。)
例如:
“/\bno\b/” 表示可以与 no字符串完全匹配;
“/\Bno\B/” 表示可以与含有no的但是no不出现在开头同时也不出现在结尾的字符串相匹配。
(说明:一般“\b”用来完全匹配字符串,“\B”用来匹配出现在字符串中间的字符。)
5. 为了能够方便用户更加灵活的设定匹配模式,正则表达式允许使用者在匹配模式中指定某一个范围而不局限于具体的字符。
其中:
/[A-Z]/ 表达式将会与从A到Z范围内任何一个大写字母相匹配;
/[a-z]/ 表达式将会与从a到z范围内任何一个小写字母相匹配;
/[0-9]/ 表达式将会与从0到9范围内任何一个数字相匹配。
例如:
/([a-z][A-Z][0-9])+/ 表示可以与包含一个或多个 以小写字母开头大写字母居中数字结尾的字符串 拼接成的字符串相匹配。
6. 元字符中也包含“或”关系,具体使用“|”来实现。
例如:
"/^(ok|yes).*(no|na)$/" 表示可以与以yes或者ok开头且以na或者no结尾的字符串相匹配。
7.当定位符“^”出现在“[]”中的开始位置时,其表示的含义为“非”。
例如:
/^[^(a-cA-C)]/ 表示可以与不以a、b、c、A、B、C开头的字符串相匹配。
8. 关于“()”,我们可以使用“()”获取一段变量,等待使用,PHP使用中用$1、$2....这种方式表示,即第一个“()”表达式用$1表示,第二个用$2表示,以此类推。
例如:
/\[b\](.*)\[\/b\]/i 括号中的任意字符可以在后面使用$1来获取。
(说明:后面的“i”的意思是忽略大小写。)
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式的应用:
1. 在php5.3中,使用 preg_match(string $pattern
, string $subject
) 函数判定 $subject 是否符合 $pattern 定义的规则,使用ereg_replace ( string $pattern
, string $replacement
, string $string
) 来将符合 $pattern 规则的 $string 替换为 $replacement,
(说明: ereg()函数已被PHP5.3x版本弃用,fnmatch()函数无法在 Windows 或其它非 POSIX 兼容的系统上使用。)
(1)PHP验证email是否合法的例子:
<html>
<body>
<form name="testRegexp" action="Regexp_PHP.php" method="post">
<input name="email" type="text" value="" />
<input name="submit" type="submit" value="提交" />
</form>
<?php
if(isset($_POST['email']))
{
$email = strtolower($_POST['email']);
$return = preg_match("/^[_\.0-9a-z]{4,16}@([0-9a-z][0-9a-z]+\.)+[a-z]{2,3}$/",$email);
if($return)
{
echo "您的 E-Mail: ".$email." 通过初步检查";
}else{
echo "您的 E-Mail: ".$email." 未通过初步检查";
}
}
?>
<body>
<html>
(2)PHP根据正则表达式规则替换字符串的例子:
<?php $string='[b]粗体字[/b]'; $b_rst=preg_replace('/\[b\](.*)\[\/b\]/i','<b>$1</b>',$string); //i表示不区分大小写,$1的值指向正则表达式中第一个"()"; echo $b_rst; ?>
2. 在JavaScript 1.2中带有一个功能强大的RegExp()对象,其中的test()方法可以检验目标对象中是否包含匹配模式,并相应的返回true或false。
JS验证email是否合法的例子:
<html>
<head>
<script type="text/javascript">
function verifyAddress(obj)
{
var email = obj.email.value;
alert("输入的值为:"+email);
var pattern = /^[a-zA-Z0-9_\.]{4,16}@[a-zA-Z0-9_]{2,}\.[a-zA-Z0-9]{2,}$/;
flag = pattern.test(email);
if(flag)
{
alert("您的 E-Mail: "+email+" 通过初步检查");
return true;
} else {
alert("您的 E-Mail: "+email+" 未通过初步检查");
return false;
}
}
</script>
</head>
<body>
<form onSubmit="return verifyAddress(this);">
<input name="email" type="text" value="" />
<input type="submit" value="提交" />
</form>
</body>
</html>
附录:
本文验证元字符功能的代码示例:
<html> <body> <form name="testRegexp" action="Example_PHP.php" method="post"> <input name="input" type="text" value="" /> <input name="submit" type="submit" value="提交" /> </form> <?php if(isset($_POST['input'])) { $input = $_POST['input']; $pattern = "//"; //$pattern = "/love$/"; //$pattern = "/^ok{3,}/"; // 字符串中必须包含o,o后面至少有一个k //$pattern = "/^[_\.0-9a-z]{4,16}@([0-9a-z][0-9a-z]+\.)+[a-z]{2,3}$/"; // Email //$pattern = "/^[\d{3}]1000$/"; //三位数字+1000 //$pattern = "/\bok\b/"; //完全匹配独立单词:ok //$pattern = "/\B[\d*]/"; //所输入的内容中可以有数字,但是不能出现在开头,类似账号注册 //$pattern = "/\bno\b/"; //表示可以与包含no字符且开头必须为 以no开头但是不能以no结尾的字符串相匹配。 //$pattern = "/([a-z][A-Z][0-9])+/"; //表示可以与包含一个或多个 以小写字母开头大写字母居中数字结尾的字符串 拼接成的字符串相匹配。 //$pattern = "/^(ok|yes).*(no|na)$/"; //表示可以与以yes或者ok开头且以na或者no结尾的字符串相匹配。 //$pattern = "/^[^(a-cA-C)]/"; // 表示可以与不以a、b、c、A、B、C开头的字符串相匹配。 $return = preg_match($pattern,$input); if($return) { echo "输入的值:".$input." 符合:".$pattern." 规则"; }else{ echo "输入的值:".$input." 不符合:".$pattern." 规则"; } } ?> <body> <html>
End.