参考:http://www.cnblogs.com/graphics/archive/2010/06/02/1749707.html;
http://blog.chinaunix.net/uid-20592805-id-1918687.html;
http://www.blogjava.net/landor2004/archive/2011/03/02/345500.html;
原文符号
因为?在正则表达式中有特殊的含义,所以如果想匹配?本身,则需要转义,\?
有无量词
问号可以表示重复前面内容的0次或一次,也就要么不出现,要么出现一次。
非贪婪匹配
贪婪匹配
在满足匹配时,匹配尽可能长的字符串,默认情况下,采用贪婪匹配
string pattern1 = @"a.*c"; // greedy match
Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abcabc"
非贪婪匹配
在满足匹配时,匹配尽可能短的字符串,使用?来表示非贪婪匹配
string pattern1 = @"a.*?c";
// non-greedy match Regex regex = new Regex(pattern1);
regex.Match("abcabc"); // return "abc"
几个常用的非贪婪匹配Pattern
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
不捕捉模式
如何关闭圆括号的捕获能力?而只是用它来做分组,方法是在左括号的后边加上:?,这里第一个圆括弧只是用来分组,而不会占用捕获变量,所以$1的内容只能是steak或者burger,而永远不可能是bronto。
while(<>){
if(/(?:bronto)(steak|burger)/){
print "Fred wants a $1\n" ;
}
}
非捕捉用的括号的详细介绍
我们已经知道括号可以捕捉匹配上的字符串,并将它们存入变量之中,如果只想用括号将某部分进行分组?考虑这样的正则表达式:只希望其中一部分括号中所匹配的内容被存入内存变量中。在下面的例子中,我们希望“bronto”是可选择的,为了将它变成可选择的,我们需要将它用括号括起来。接着,模式使用了一个模式可以得到“steak”或者“burger”,匹配上的字符串被存入内存变量中。
if(/(bronto)?saurus (steak|burger)/)
{
print “Fred wants a $2\n”;
}
即便“bronto”没有被匹配上,此部分仍然会存入$1。Perl 统计开括号的个数,从而给这些变量命名。我们需要的部分被存入$2。当模式变复杂时,情况就变得非常复杂。
幸运的是,Perl 的正则表达式有一种方法可以使括号只进行分组,而不会引起内存变量的分配。我们将它叫做非捕捉用的括号(non-capturing parentheses),对于它,有一个特殊的写法。我们在开括号后面加上一个问号和冒号,(?:)◆,其作用是告诉Perl 括号只是分组的作用。
◆这是?号在正则表达式中的第四种用法:问号,表示0 或1 的数量词,非贪婪修饰符,现在是开头符
改变上述正则表达式,使之对“bronto”是非捕捉用的括号,我们需要的部分被存入变量$1。
if(/(?:bronto)?saurus (steak|burger)/)
{
print “Fred wants a $1\n”;
}
如果以后需要改变正则表达式,如在brontosaurs burger 上再加入barbecue,我们可以加入“BBQ ”(含有空格),并且使括号是非捕捉用的,那么我们需要的部分所对应的内存变量仍为$1。否则,可能每一次在正则表达式中加入括号时,需要改变内存变量名。
if (/(?:bronto)?saurus (?:BBQ )?(steak|burger)/)
{
print “Fred wants a $1\n”;
}
预见匹配
简单说,就是匹配时考虑预见匹配的那一部分,不符合的不能算匹配上,但匹配的结果部分(变量$&)要除去预见匹配部分,又分两种。
1 肯定预见匹配 /pattern(?=string)/;匹配时,要考虑符合string
遇见功能,"?=",意识说目标串中肯定存在什么,比如:
var str="ab4";
var reg=/ab(?=\d)/g
alert(reg.test(str));//结果为true意思是第三位肯定是数字;
2 否定预见匹配 /pattern(?!string)/;匹配时,要考虑不符合string的才行,结果$&仍然只是取patern部分,不包括string
"?!",意思说目标串中不应该存在什么
var str="ab1";
var reg=/ab(?!\d)/g
alert(reg.test(str));//结果为false
意思是目标串中的第三位不应该是数字。
相关推荐
### 正则表达式转义字符详解 #### 一、引言 正则表达式(Regular ...理解这些转义字符的意义和使用方法对于编写高效、准确的正则表达式至关重要。希望本文介绍的内容能对大家理解和运用正则表达式有所帮助。
Kleene的工作奠定了正则表达式的理论基础,这种表达方式随后被应用于多种编程语言和环境中,成为处理文本数据的标准方法之一。 ### 正则表达式定义 正则表达式(Regular Expression)是一种由一系列字符和特殊符号...
正则表达式是一种强大的文本处理工具,它在编程语言、文本编辑器以及各种解析和搜索应用中被广泛使用。在编译原理中,正则表达式是构建词法分析器(Scanner 或 Lexer)的关键概念,它能简洁地描述语言中的词汇结构。...
在学习完本课程后,学员应能掌握正则表达式的基础知识,包括各种操作符的含义和使用方法,以及如何在Python中使用`re`模块进行匹配、替换等操作。同时,通过实例练习,如中国大学排名、淘宝商品信息、股票数据等爬虫...
正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和提取字符串中的特定模式。在编程语言中,正则表达式广泛应用于数据验证、文本提取、爬虫数据处理等多个场景。下面我们将深入探讨正则表达式的常用模式...
在Linux系统中,通配符和正则表达式是两种非常重要的文本匹配工具,它们用于在命令行中筛选和操作文件或数据。了解并熟练掌握这两种技术对于日常的系统管理和数据分析至关重要。 首先,让我们来看看通配符。通配符...
在使用这些工具时,了解和掌握正则表达式的规则对于准确表达用户的意图非常重要。用户可以通过练习不同的正则表达式模式,来加深对规则的理解并提高处理文本数据的效率。对于遇到的疑问,用户也可以查阅相关文档或向...
总结而言,正则表达式是Linux shell脚本中处理文本的强大工具,掌握其用法能够极大提升文本处理的效率和能力。通过上述的详细解释,读者应能对正则表达式的概念、特点、组成及其在shell脚本中的应用有一个全面的了解...
但在本文中,主要使用正则表达式来进行操作,因为其表达能力强,灵活性高。 通过本文的内容,我们可以了解到利用PHP中的正则表达式来提取和修改HTML标签属性的基本方法。这些方法对于动态页面的生成、内容的提取或...
在课程讲义中,通过正则表达式(Regular Expressions)的学习,学生可以了解到如何使用这些表达式来匹配特定的文本模式,如单词、数字以及其他符号,实现对文本的有效分割。 正则表达式是一种用来描述字符排列和...
”中的问号使用不当,两个问句之间应用逗号隔开,正确的标点应该是“祥子,你是让狼叼去了,还是上非洲挖金矿去了?”;“有首名叫‘常回家看看’的歌曲”中的引号使用正确,表示特指的歌名。 5. **语句排序**: -...
在前端开发中,URL参数传递是一种常见需求,而...通过上述方法和注意事项的介绍,我们可以有效地过滤和编码URL参数中的特殊字符,确保URL的正确传递和参数的准确表达。这对提升Web应用的安全性与稳定性都有重要的意义。
在总结中提到,fnmatch模块完成的匹配操作介于简单的字符串方法和全功能的正则表达式之间。它在简单性与灵活性之间取得了一个平衡,使得在很多简单的场景下,我们可以方便快捷地使用它来进行模式匹配,而无需编写...