D语言中国主页  D语言编辑器SciTE4D   DWin库 D语言官方网站
D语言编译器1.x最新版 OpenSource   Tango   webnews  Wiki

查看完整版本: D语言正则表达式教程

yidabu 2007-5-5 08:21

D语言正则表达式教程

D语言正则表达式教程知识若不分享 实在没有意义 http://www.d-programming-language-china.org 20070502点击下面网址查看原文:http://www.d-programming-language-china.org        by:        D语言论坛 http://www.d-programming-language-china.org        from:        http://www.digitalmars.com/d/regular-expression.html        version:        基于D 1.014tag:D语言论坛,D语言中文论坛,D语言学习        无论学习哪一门程序设计语言,正则表达式是必须比较熟练掌握的(你会去学不支持正则表达式的程序设计语言吗)。        D语言论坛 http://www.d-programming-language-china.org 试用了一下D语言的正则表达式,总的感觉是:有比没有好。比起一些脚本语言,D的正则表达式引擎是不够强大的。        正则表达式是强大的文字匹配处理工具,被内建在Perl,Ruby,Javascript等语言的核心。Perl和Ruby特别擅长于正则表达式的处理。为什么不把正则表达式内建在D的核心呢?下面是D和Ruby使用正则表达式的比较。        本文说明如何在D里使用正则表达式。关于正则表达式本身,已经有许多的专著,不在本文范围之内。D的正则表达式实现在Phobos库的std.regexp模块里。正则表达式和模板元编程的结合应用,请参考Templates Revisited:        http://digitalmars.com/d/templates-revisited.html        在Ruby里,用特殊文字量来创建正则表达式:        [Copy to clipboard] [ - ]CODE:                                r = /pattern/                s = /p[1-5]\s*/                D没有对应的特殊文字量,不过可以这样创建:( 本文出处: http://www.d-programming-language-china.org )        [Copy to clipboard] [ - ]CODE:                                r = RegExp("pattern");                s = RegExp(r"p[1-5]\s*");                如果模式串包含反斜杠\,可以使用所见即所得字符串文字量,也就是用r作为字符串的前缀。r和s和RegExp型别,我们可以用类型推断自动声明和赋值。        [Copy to clipboard] [ - ]CODE:                                auto r = RegExp("pattern");                auto s = RegExp(r"p[1-5]\s*");                在Ruby里使用=~操作符来检查字符串里第一个匹配项的位置:        [Copy to clipboard] [ - ]CODE:                                s = "abcabcabab"                s =~ /b/    /* match, returns 1 */                s =~ /f/    /* no match, returns nil */                在D里象这样使用:        [Copy to clipboard] [ - ]CODE:                                auto s = "abcabcabab";                std.regexp.find(s, "b");    /* match, returns 1 */                std.regexp.find(s, "f");    /* no match, returns -1 */                注意:一样可以用std.string.find来搜索子串匹配而不是使用正则表达式。        Ruby =~运行符在结果里设置了隐式定义变量:( 本文出处: http://www.d-programming-language-china.org )        [Copy to clipboard] [ - ]CODE:                                s = "abcdef"                if s =~ /c/                    "#{$`}[#{$&}]#{$'}"    /* generates string ab[c]def                在D语言里,std.regexp.search() 函数返回RegExp对象描述了匹配的情况,请看下面的例子:        [Copy to clipboard] [ - ]CODE:                                auto m = std.regexp.search("abcdef", "c");                if (m)                    writefln("%s[%s]%s", m.pre, m.match(0), m.post);                也可以写得更简单        [Copy to clipboard] [ - ]CODE:                                if (auto m = std.regexp.search("abcdef", "c"))                    writefln("%s[%s]%s", m.pre, m.match(0), m.post); // writes ab[c]def        搜索和替换        搜索和替换是最令人关注的功能。把"a"替换成"ZZ",替换第一次出现的"a"和替换全部"a",Ruby里是这样的:        [Copy to clipboard] [ - ]CODE:                                s = "Strap a rocket engine on a chicken."                s.sub(/a/, "ZZ") // result: StrZZp a rocket engine on a chicken.                s.gsub(/a/, "ZZ") // result: StrZZp ZZ rocket engine on ZZ chicken.                在D里这样:        [Copy to clipboard] [ - ]CODE:                                s = "Strap a rocket engine on a chicken.";                sub(s, "a", "ZZ");    // result: StrZZp a rocket engine on a chicken.                sub(s, "a", "ZZ", "g");    // result: StrZZp ZZ rocket engine on ZZ chicken.                可以使用$&, $$, $', $`, .. 等9个标记引用匹配:( 本文出处: http://www.d-programming-language-china.org )        [Copy to clipboard] [ - ]CODE:                                sub(s, "[ar]", "[$&]", "g"); // result: St[r][a]p [a] [r]ocket engine on [a] chicken.                替换字符串可以使用委托:        [Copy to clipboard] [ - ]CODE:                                sub(s, "[ar]",                    (RegExp m) { return toupper(m.match(0)); },                    "g");    // result: StRAp A Rocket engine on A chicken.                (toupper() comes from std.string.)循环        It's possible to search over all matches within a string:        [Copy to clipboard] [ - ]CODE:                                import std.stdio;                import std.regexp;                                void main()                {                    foreach(m; RegExp("ab").search("abcabcabab"))                    {                        writefln("%s[%s]%s", m.pre, m.match(0), m.post);                    }                }                // Prints:                // [ab]cabcabab                // abc[ab]cabab                // abcabc[ab]ab                // abcabcab[ab]        Conclusion        D regular expression handling is as powerful as Ruby's. But its syntax isn't as concise:        Regular expression literal syntax - doing so would make it impossible to perform lexical analysis without also doing syntactic or semantic analysis.        Implicit naming of match variables - this causes problems with name collisions, and just doesn't fit with the rest of the way D works.        But it is just as powerful.( 本文出处: http://www.d-programming-language-china.org )( lastupdate:20070505 最新文章请访问http://www.d-programming-language-china.org )关于一大步成功社区:yidabu提倡在交流中学习,在分享中提高收集感兴趣的知识,写下心得,通过网络与别人一起分享理解一点就实践一步,收获什么就分享什么,成功就是这样一点点一步步累积起来的网络只是一个工具,只有自己身心提高才是实实在在的。d-programming-language-china.org为大家提供一个学习交流各种知识的平台
页: [1]
查看完整版本: D语言正则表达式教程