博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则表达式中一些比较难理解的
阅读量:5259 次
发布时间:2019-06-14

本文共 1634 字,大约阅读时间需要 5 分钟。

正则表达式中一些比较难理解的

一、回溯与非回溯

使用“(?>…)”方式进行非回溯声明。由于正则表达式引擎的贪婪特性,导致它在某些情况下,将进行回溯以获得匹配,请看下面的示例:

ExpandedBlockStart.gif
None.gifstring x = "Live for nothing,die for something";
None.gifRegex r1 
= new Regex(@".*thing,");
None.gif
if (r1.IsMatch(x))
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"match:" + r1.Match(x).Value);//输出:Live for nothing,
ExpandedBlockEnd.gif
}
None.gifRegex r2 
= new Regex(@"(?>.*)thing,");
None.gif
if (r2.IsMatch(x))//不匹配
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"match:" + r2.Match(x).Value);
ExpandedBlockEnd.gif}
None.gif
//在r1中,“.*”由于其贪婪特性,将一直匹配到字符串的最后,随后匹配“thing”,但在匹配“,”时失败,此时引擎将回溯,并在“thing,”处匹配成功。
None.gif
在r2中,由于强制非回溯,所以整个表达式匹配失败。
None.gif

二、反向引用

\ 数字

后向引用。例如,(\w)\1 查找双写的单词字符。

\k<name>

命名后向引用。例如,(?<char>\w)\k<char> 查找双写的单词字符。表达式 (?<43>\w)\43 执行同样的操作。可以使用单引号替代尖括号,例如 \k'char'

三、正向预搜索、反向预搜索

(10)正向预搜索、反向预搜索

正向预搜索声明格式:正声明 “(?=…)”,负声明 “(?!...)” ,声明本身不作为最终匹配结果的一部分,请看下面的示例:

ExpandedBlockStart.gif
None.gifstring x = "1024 used 2048 free";
None.gifRegex r1 
= new Regex(@"\d{4}(?= used)");
None.gif
if (r1.Matches(x).Count==1)
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"r1 match:" + r1.Match(x).Value);//输出:1024
ExpandedBlockEnd.gif
}
None.gifRegex r2 
= new Regex(@"\d{4}(?! used)");
None.gif
if (r2.Matches(x).Count==1)
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"r2 match:" + r2.Match(x).Value); //输出:2048
ExpandedBlockEnd.gif
}
None.gif
//r1中的正声明表示必须保证在四位数字的后面必须紧跟着“ used”,r2中的负声明表示四位数字之后不能跟有“ used”。
None.gif

反向预搜索声明格式:正声明“(?<=)”,负声明“(?<!)”,声明本身不作为最终匹配结果的一部分,请看下面的示例:

ExpandedBlockStart.gif
None.gifstring x = "used:1024 free:2048";
None.gifRegex r1 
= new Regex(@"(?<=used:)\d{4}");
None.gif
if (r1.Matches(x).Count==1)
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"r1 match:" + r1.Match(x).Value);//输出:1024
ExpandedBlockEnd.gif
}
None.gifRegex r2 
= new Regex(@"(?<!used:)\d{4}");
None.gif
if (r2.Matches(x).Count==1)
ExpandedBlockStart.gif
{
InBlock.gif    Console.WriteLine(
"r2 match:" + r2.Match(x).Value);//输出:2048
ExpandedBlockEnd.gif
}
None.gif
//r1中的反向正声明表示在4位数字之前必须紧跟着“used:”,r2中的反向负声明表示在4位数字之前必须紧跟着除“used:”之外的字符串。
None.gif
posted on
2011-05-11 15:30 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/navy235/archive/2011/05/11/2043271.html

你可能感兴趣的文章
Django 相关
查看>>
Python(软件目录结构规范)
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
条件断点 符号断点
查看>>
python的多行注释
查看>>
连接Oracle需要jar包和javadoc文档的下载
查看>>
Dreamweaver cc新版本css单行显示
查看>>
【android】安卓的权限提示及版本相关
查看>>
Java基础教程——网络基础知识
查看>>
Kruskal基础最小生成树
查看>>
【hdu 1429】胜利大逃亡(续)
查看>>
关于收费软件
查看>>
javascript之Style物
查看>>
Factory Design Pattern
查看>>
P1192-台阶问题
查看>>
一、使用pip安装Python包
查看>>
Duilib扩展《01》— 双击、右键消息扩展
查看>>
网站产品设计
查看>>
go 学习笔记(4) ---项目结构
查看>>