`
duguyidao
  • 浏览: 137523 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
文章分类
社区版块
存档分类
最新评论

regular expression/regex(5)

阅读更多
使用?*或+ 进行重复

?:告诉引擎匹配前导字符0次或一次。事实上是表示前导字符是可选的。

+:告诉引擎匹配前导字符1次或多次

*:告诉引擎匹配前导字符0次或多次

<[A-Za-z][A-Za-z0-9]*>匹配没有属性的HTML标签,“<”以及“>”是文字符号。第一个字符集匹配一个字母,第二个字符集匹配一个字母或数字。

我们似乎也可以用<[A-Za-z0-9]+>。但是它会匹配<1>。但是这个正则表达式在你知道你要搜索的字符串不包含类似的无效标签时还是足够有效的。



·        限制性重复

许多现代的正则表达式实现,都允许你定义对一个字符重复多少次。词法是:{min,max}。min和max都是非负整数。如果逗号有而max被忽略了,则max没有限制。如果逗号和max都被忽略了,则重复min次。

因此{0,}和*一样,{1,}和+ 的作用一样。

你可以用<<\b[1-9][0-9]{3}\b>>匹配1000~9999之间的数字(“\b”表示单词边界)。<<\b[1-9][0-9]{2,4}\b>>匹配一个在100~99999之间的数字。



·        注意贪婪性

假设你想用一个正则表达式匹配一个HTML标签。你知道输入将会是一个有效的HTML文件,因此正则表达式不需要排除那些无效的标签。所以如果是在两个尖括号之间的内容,就应该是一个HTML标签。

许多正则表达式的新手会首先想到用正则表达式<< <.+> >>,他们会很惊讶的发现,对于测试字符串,“This is a <EM>first</EM> test”,你可能期望会返回<EM>,然后继续进行匹配的时候,返回</EM>。

但事实是不会。正则表达式将会匹配“<EM>first</EM>”。很显然这不是我们想要的结果。原因在于“+”是贪婪的。也就是说,“+”会导致正则表达式引擎试图尽可能的重复前导字符。只有当这种重复会引起整个正则表达式匹配失败的情况下,引擎会进行回溯。也就是说,它会放弃最后一次的“重复”,然后处理正则表达式余下的部分。

和“+”类似,“?*”的重复也是贪婪的。



·        深入正则表达式引擎内部

让我们来看看正则引擎如何匹配前面的例子。第一个记号是“<”,这是一个文字符号。第二个符号是“.”,匹配了字符“E”,然后“+”一直可以匹配其余的字符,直到一行的结束。然后到了换行符,匹配失败(“.”不匹配换行符)。于是引擎开始对下一个正则表达式符号进行匹配。也即试图匹配“>”。到目前为止,“<.+”已经匹配了“<EM>first</EM> test”。引擎会试图将“>”与换行符进行匹配,结果失败了。于是引擎进行回溯。结果是现在“<.+”匹配“<EM>first</EM> tes”。于是引擎将“>”与“t”进行匹配。显然还是会失败。这个过程继续,直到“<.+”匹配“<EM>first</EM”,“>”与“>”匹配。于是引擎找到了一个匹配“<EM>first</EM>”。记住,正则导向的引擎是“急切的”,所以它会急着报告它找到的第一个匹配。而不是继续回溯,即使可能会有更好的匹配,例如“<EM>”。所以我们可以看到,由于“+”的贪婪性,使得正则表达式引擎返回了一个最左边的最长的匹配。



·        用懒惰性取代贪婪性

一个用于修正以上问题的可能方案是用“+”的惰性代替贪婪性。你可以在“+”后面紧跟一个问号“?”来达到这一点。“*”,“{}”和“?”表示的重复也可以用这个方案。因此在上面的例子中我们可以使用“<.+?>”。让我们再来看看正则表达式引擎的处理过程。

再一次,正则表达式记号“<”会匹配字符串的第一个“<”。下一个正则记号是“.”。这次是一个懒惰的“+”来重复上一个字符。这告诉正则引擎,尽可能少的重复上一个字符。因此引擎匹配“.”和字符“E”,然后用“>”匹配“M”,结果失败了。引擎会进行回溯,和上一个例子不同,因为是惰性重复,所以引擎是扩展惰性重复而不是减少,于是“<.+”现在被扩展为“<EM”。引擎继续匹配下一个记号“>”。这次得到了一个成功匹配。引擎于是报告“<EM>”是一个成功的匹配。整个过程大致如此。



·        惰性扩展的一个替代方案

我们还有一个更好的替代方案。可以用一个贪婪重复与一个取反字符集:“<[^>]+>”。之所以说这是一个更好的方案在于使用惰性重复时,引擎会在找到一个成功匹配前对每一个字符进行回溯。而使用取反字符集则不需要进行回溯。

最后要记住的是,本教程仅仅谈到的是正则导向的引擎。文本导向的引擎是不回溯的。但是同时他们也不支持惰性重复操作。
分享到:
评论

相关推荐

    C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

    正则表达式 C/C++ Regex/Regular Expression(C/C++正则表达式库实现)

    Regex Expression(正则表达式)

    Regular expression 具有可以表达出难以描述、複杂、但是却有特殊规则的字串的功能,所以许多...本文就是要介绍如何利用 GNU Regex 程式库,使自己的程式具有 regular expression 的功能。 这里有文件Regex.h,Regex.c

    正则教程 regex regular expression

    正则表达式( Regular Expression , regex )是一个工具。向所有其他工具一样,正则表达式是用来解决一类特定问题的。理解正则表达式以及其可以做什么的最好方式就是理解它们可以解决什么问题。

    regular expression library正则表达式库

    GNU Regex 程式库是 GNU 发展,提供操作比对 Regular Expression 文字字串的程式库,也就是使用 GNU Regex 程式库,可以作到以下的功能: 比对一字串是否完全与 Regular Expression 相幅合。 在一字串中寻找与 ...

    正则表达式资料全集 Regular Expression Syntax Reference

    正则表达式资料全集.rar Regular Expression Syntax Reference

    The Regex Coach - interactive regular expressions

    The Regex Coach is a graphical application for Windows which can be used to experiment with (Perl-compatible) regular expressions interactively. It has the following features: It shows whether a ...

    regular expression processor

    regular expression processor, 将正则表达式转换成NFA,接着讲NFA转换成DFA,并输出DFA。同时可以生成DOT文件,以提供给graphviz生成图形界面。

    Regular Expression

    Regular Expression

    正则表达式完全指南

    A regular expression regex or regexp for short is a special text string for describing a search pattern You can think of regular expressions as wildcards on steroids You are probably familiar with ...

    Python正则表达式(Regular Expression)

    一个用来测试Python正则表达式的工具 图形界面,简单易用,适合学习Python的正则表达式,内附帮助文档及范例。

    正则表达式Regular Expression (RegExp)详解

    正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE)。 正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的...

    正则表达式 测试 工具Regex Testor

    我们在使用正则表达式( regex: regular expression )的过程中,经常发现正则表达式的语法很令人头疼,即使对经常使用它的人来说也是如此。对于刚接触正则表达式的人来说多练习,多使用,才能熟练掌握正则表达式。 ...

    boost.regex

    boost regular expression

    regex-2.7-lib.zip

    regular expression library

    regex:PHP内置preg_ *函数的合理接口

    spatie/regex为preg_match , preg_match_all , preg_replace和preg_replace_callback提供了更spatie/regex接口。 use Spatie \ Regex \ Regex ;// Using `match`Regex :: match ( '/a/' , 'abc' ); // `...

    PCRE(Perl Compatible Regular Expressions)

    PCRE(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正规表达式库.这些在执行正规表达式模式匹配时用与Perl 5同样的语法和语义是很有用的。Boost太庞大了,使用boost regex后,程序的编译速度...

    正则表达式搜索栏「Regular Expression Search Bar」-crx插件

    默认Chrome查找栏的改进版本,支持使用正则表达式。 通过按Ctrl + f并输入要匹配的文本或正则表达式,可以在您访问的所有网页上查找文本。可以通过将正则表达式包装在正斜杠(/)中并在其后附加标志来输入正则表达式...

    regexjs:一个快速且最小的正则表达式引擎

    const { createMatcher } = require ( './regex' ) ; const match = createMatcher ( '(a|b)*c' ) ; match ( 'ac' ) ; // true match ( 'abc' ) ; // true match ( 'aabababbbc' ) ; // true match ( 'aaaab' ) ; /...

    Mastering Regular Expressions.pdf

    Mastering Regular Expressions.pdf

    Jeffrey E. F. Friedl - Mastering.Regular.Expressions.3rd.Edition

    How the regular expression engine works Optimization (major savings available here!) Matching just what you want, but not what you don't want Sections and chapters on individual languages Written...

Global site tag (gtag.js) - Google Analytics