61阅读

vim查找正则表达式-正则表达式教程之前后查找lookaround详解

发布时间:2017-08-19 所属栏目:正则表达式任意字符

一 : 正则表达式教程之前后查找lookaround详解

本文实例讲述了正则表达式教程之前后查找lookaround。分享给大家供大家参考,具体如下:

注:在所有例子中正则表达式匹配结果包含在源文本中的之间,有的例子会使用Java来实现,如果是java本身正则表达式的用法,会在相应的地方说明。所有java例子都在JDK1.6.0_13下测试通过。

一、问题引入

在HTML页面中,匹配出一对标签之间的文本,如匹配出页面的标签,即<title>与</title>之间的文本:

文本:<head><TITLE>welcome to my page</title></head>

正则表达式:<[Tt][Ii][Tt][Ll][Ee]>.*?</ [Tt][Ii][Tt][Ll][Ee]>

结果:<head>【<TITLE>welcome to my page</title>】</head>

分析:<[Tt][Ii][Tt][Ll][Ee]>表示不区分大小写,这个模式匹配到了title标签以及它们之间的文本,但是并不完美,因为我们只想要title标签之间的文本,而不包括标签本身。解决这个问题我们就需要用到前后查找(lookaround)。

二、向前查找

向前查找指定了一个必须匹配但不在结果中返回的模式。向前查找实际上就是一个子表达式,它以?=开头,需要匹配的文本跟在=的后面。

看一个匹配出一个URL地址中协议部分的例子:

文本:http://blog.csdn.net/mhmyqn

正则表达式:.+(?=:)

结果:【http】://blog.csdn.net/mhmyqn

分析:URL地址中协议部分是在:之前的部分,模式.+匹配任意文本,子表达式(?=:)匹配:,但是被匹配到的:并没有出现在结果中。我们使用?=向正则表达式引擎表明,只要找到:就行了,但不包括在最终的返回结果里。这里如果不使用向前匹配(?=:),而是直接使用(:),那么匹配结果就会是http:了,它包括了:,并不是我们想要的。

注意:前后查找中的前、后是指模式与被查找文本的相对位置而言的,左为前,右为后。即向前查找为:xxx(?=xxx),而向后查找为(?<=xxx)xxx,向后查找在接下来会介绍到。

三、向后查找

向后查找操作符是?<=。但是并不是所有的正则表达式实现都支持向后查找,JavaScript就不支持,java语言支持向后查找。

比如要查找文本当中的价格(以$开头,后面跟数字),结果不包含货币符号:

文本:category1:$136.25,category2:$28,category3:$88.60

正则表达式:(?<=$)d+(.d+)?

结果:category1:$【136.25】,category2:$【28】,category3:$【88.60】

分析:(?<=$)模式匹配$,d+(.d+)?模式匹配整数或小数。从结果可以看出,结果不没有包括货币符号,只匹配出了价格。如果不使用向后查找,情况会是什么样呢?使用模式$d+(.d+)?,这样会把$包含在结果中。使用模式d+(.d+)?,又会把categery1(23)中的数字也匹配出来,都不是我们想要的。

注意:向前查找模式的长度是可变的,它们可以包含.、*、+之类的元字符;而向后查找模式只能是固定长度,不能包含.、*、+之类的元字符。

四、把向前查找和向后查找结合起来

把向前查找和向后查找结合起来使用,即可解决前面HTML标签之间的文本的问题:

文本:<head><TITLE>welcome to my page</title></head>

正则表达式:(?<=<[Tt][Ii][Tt][Ll][Ee]>).*?(?=</ [Tt][Ii][Tt][Ll][Ee]>)

结果:<head><TITLE>【welcome to my page】</title></head>

分析:从结果可以看出,问题完美的解决了。(?<=<[Tt][Ii][Tt][Ll][Ee]>)是一个向后操作,它匹配<title>但不消费它,(?=</[Tt][Ii][Tt][Ll][Ee]>)是一个向前操作,它匹配</title>但不消费它。最终返回的匹配结果只包含了标签之间的文本了。

五、对前后查找取非

前面说到的向前查找和向后查找通常都是用来匹配文本,其目的是为了确定将被返回的匹配结果的文本的位置(通过指定匹配结果的前后必须是哪些文本)。这种用法叫正向前查找和正向后查找。还有一种负向前查找和负向后查找,是查找那些不与给定模式相匹配的文本。

前后查找的操作符:

(?=) 正向前查找
(?!) 负向前查找
(?<=) 正向后查找
(?<!) 负向后查找

比如一段文本中即有价格(以$开头,后面跟数字)和数量,我们要找出价格和数量,先来看查找价格:

文本:I paid $30 for 10 apples, 15 oranges, and 10 pears. I saved $5 onthis order.

正则表达式:(?<=$)d+

结果:I paid 【$30】 for 10 apples, 15 oranges, and 10 pears. I saved 【$5】 on thisorder.

查找数量:

文本:I paid $30 for 10 apples, 15 oranges, and 10 pears. I saved $5 onthis order.

正则表达式:b(?<!$)d+b

结果:I paid $30 for 【10】 apples, 【15】 oranges, and 【10】pears. I saved $5 on this order.

分析:(?<!$)表示一个负向后查找,它使得结果只包含那些不以$开头的数值。

六、小结

有了前后查找,就可以对最终的匹配结果包含哪些内容做出精确的控制。前后查找操作使我们可以利用子表达式来指定文本匹配操作发生的位置,并收到只匹配不消费的效果。

PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用:

JavaScript正则表达式在线测试工具:
http://tools.61k.com/regex/javascript

正则表达式在线生成工具:
http://tools.61k.com/regex/create_reg

希望本文所述对大家正则表达式学习有所帮助。

二 : 关于查找中文文本的正则表达式。

大学学到的东西,这一刻,终于能派上用场。(www.61k.com]。。
终于能对外宣称,我大学没有白念了。。。。。。
记录一下:
在开发环境中,如 www.61k.com ,搜索中文文本的方法。
即打开搜索功能(CTRL+SHIFT+F),then,开启“use regular expression”选项。
然后,输入.*[\u4e00-\u9fa5]+.*

简单说明:
.表示任意字符,
*表示重复0到无限次
+表示重复1到无限次
[ ]表示枚举[ ]中出现的字符
\u表示unicode编码
\u4e00-\u9fa5表示汉字所属的unicode代码段。。

以上。

三 : EditPlus查找PHP源码简单数字型注入的正则表达式

今天看一个项目代码,文件不多,不过每个文件中都N多注入,一个一个看实在太累,索性花了点时间,弄了个正则表达式,搜索出来,然后再将安全的筛选出去。省了不少时间的说。 1.查找select、update、delete语句
((select|SELECT|update|UPDATE|delete|DELETE) .*(from|FROM|set|SET) .*(where|WHERE) .*) 查询语句,对于没有条件判断的基本不存在注入问题,因而仅搜索此语句即可
例子:
select * from user where 2.简单的数字型注入
((select|SELECT|update|UPDATE|delete|DELETE) .*(from|FROM|set|SET) .*(where|WHERE) .*=[ ]?["]?["]?$) 能找到select、update delete三种语句,5种格式的整形注入,如:
直接变量传入
select * from guess where id=$subject_id
update guess set is_valid=0 where id=$subject_id
delete from guess where id=$subject_id
=与变量之间存在空格
select * from guess where id= $subject_id
update guess set is_valid=0 where id= $subject_id
delete from guess where id= $subject_id
变量双引号
select * from guess where id="$subject_id"
update guess set is_valid=0 where id="$subject_id"
delete from guess where id="$subject_id"
=与双引号之间存在空格
select * from guess where id= "$subject_id"
update guess set is_valid=0 where id= "$subject_id"
delete from guess where id= "$subject_id"
=与引号、双引号之间存在空格
select * from guess where id= " $subject_id"
update guess set is_valid=0 where id= " $subject_id"
delete from guess where id= " $subject_id"

四 : 正则表达式例子:在一个字符串中查找另一个字符串

<html>
<head><title>正则表达式</title></head>
<body>
<ahref="./">返回列表</a><br>
<formaction="<?echo$PHP_SELF;?>"method="post">
在<inputtype="text"name="string"value="<?echo$string;?>">中查找<inputtype="text"name="query"value="<?echo$query;?>"><br>
<inputtype="radio"name="where"value=""<?if(!isset($where)or$where=="")echo"checked";?>>第二个字符串可以在第一个字符串的任何位置<br>
<inputtype="radio"name="where"value="^"<?if(isset($where)and$where=="^")echo"checked";?>>第一个字符串以第二个字符串开始<br>
<inputtype="radio"name="where"value="$"<?if(isset($where)and$where=="$")echo"checked";?>>第一个字符串以第二个字符串结束<br>
<inputtype="checkbox"name="case"value="case"<?if(isset($case))echo"checked";?>>区分大小写<br>
<inputtype="submit"value="查询">
</form>
<?
if(isset($string)andisset($query)and$string<>""and$query<>""){
if(isset($case)){
$func="ereg";
}
else{
$func="eregi";
}
switch($where){
case"^":
$query="^".$query;
break;
case"$":
$query.="$";
break;
}
eval("$found=$func("$query","$string");");
if($found){
echo"找到!";
}
else{
echo"未找到!";
}
}
?>
</body>
</html>

五 : js中使用正则表达式查找字母和数字的方法

废话不多说,先看下js中使用正则查找字母和数字的方法,具体代码如下所示:

 <!DOCTYPE HTML> <html > <head> <meta charset="UTF-8"> <title></title> <script type="text/javascript"> window.onload=function(){ localStorage.fiveData="你好啊 世界"; //alert(localStorage.fiveData); //var reg=/d+/g;//匹配任意长度数字 var reg=/[a-z,A-Z]/g;//匹配任意字母 var str="aajdaf1232jadlfjakdjfalkjlakfj2131l34kalfsjaafaqejqe231wk"; var t=str.match(reg); for(var c in t){ console.log(t[c]); } } </script> </head> <body> </body> </html>

下面看下JS 用正则表达式,验证密码包含数字和字母的方法

必须包含至少一位数字和一位字母,脚本方法如下:

 function CheckPassWord(password) {//密码必须包含数字和字母  var str = password;  if (str == null || str.length < 8) {  return false;  }  var reg = new RegExp(/^(?![^a-zA-Z]+$)(?!D+$)/);  if (reg.test(str))  return true; }

必须包含数字加字母 不能包含特殊符号等,脚本方法如下:

 function CheckPassWord(password) {//必须为字母加数字且长度不小于8位  var str = password;  if (str == null || str.length <8) {  return false;  }  var reg1 = new RegExp(/^[0-9A-Za-z]+$/);  if (!reg1.test(str)) {  return false;  }  var reg = new RegExp(/[A-Za-z].*[0-9]|[0-9].*[A-Za-z]/);  if (reg.test(str)) {  return true;  } else {  return false;  } }

好了,到此结束,希望对大家有所帮助!

本文标题:vim查找正则表达式-正则表达式教程之前后查找lookaround详解
本文地址: http://www.61k.com/1089487.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1