Nuva 示例代码(每日一帖)之 正则表达式(递归)
2006-08-31 10:21
453 查看
<..======================================================== == == == Macrobject Nuva Samples == == == == Copyright (c) 2004-2006 Macrobject Software == == == == ALL RIGHTS RESERVED == == == == http://www.macrobject.com == == == ========================================================..> <. function Test(theContent, thePattern) function DoMatch(Index, Length, Value, Match) Result := Value ~ /r/n ~ '-- End --' ~ /r/n; end function ? theContent.RegexMatch(thePattern, Function = 'DoMatch', Option = 'sx') end function var content assign(content).> (case (what-would-you-like-to-do?) ((learn) (choose-from FAQ textbooks blogs standards tutorials bibliography other documents education)) ((program) (choose-from implementations libraries environments SRFIs)) ((socialize) (choose-from Scheme Boston and bothton - Boston, MA, USA Denver Lispers - Denver, CO, USA Scheme UK - London, UK Montreal Scheme/Lisp User Group - Montr¨¦al, Canada CRACL - Los Angeles, CA, USA Metro Schemers (no current URL) - Washington, DC, USA)) ((work) (choose-from jobs)) ((stay-informed) (choose-from events)) (else (choose-from the lighter side wares other resources))) <.end assign var pattern assign(pattern).> /( ( (?>[^()]+) | (?R) )* /) <.end assign Test(content, pattern) .>
<..
【简介】
本例是一个复杂的正则表达式程序,其中用到了正则的递归匹配。
众所周知,正规语言通常不能表示一个递归结构(上下文无关语言则可)。这是一种扩展功能,使正则表达式可以匹配一个递归结构。如上图的复杂结构(来自 http://www.schemers.org),使用带递归的正则表达式可以成功的匹配出该语言(LISP 的括号嵌套语言)。
【看点】
1、本例演示了复杂的正则操作,如正则的递归功能:
?R 即递归整个正则表达式
本例为了正则式的可读性,特意使用了 x 选项,忽略了正则中的空白成分
2、本例也演示了 Nuva 语言的特殊结构:assign
assign 是一种赋值结构,将该结构内的所有输出赋值给一个变量(左值表达式),该结构内可以任意复杂,嵌套任意成分,其所有的输出都将赋值给这个变量,从而省去了字符串连缀的麻烦。
【扩展】
本例可以进一步扩展以增强其实用性,比如可以匹配诸如 C 语言风格带嵌套 {} 的语法结构。
..>
本例运行结果如下:
(case (what-would-you-like-to-do?)
((learn)
(choose-from FAQ
textbooks
blogs
standards
tutorials
bibliography
other documents
education))
((program)
(choose-from implementations
libraries
environments
SRFIs))
((socialize)
(choose-from Scheme Boston and bothton - Boston, MA, USA
Denver Lispers - Denver, CO, USA
Scheme UK - London, UK
Montreal Scheme/Lisp User Group - Montréal, Canada
CRACL - Los Angeles, CA, USA
Metro Schemers (no current URL) - Washington, DC, USA))
((work)
(choose-from jobs))
((stay-informed)
(choose-from events))
(else
(choose-from the lighter side
wares
other resources)))
-- End --
相关文章推荐
- Nuva 示例代码(每日一帖)之 正则表达式(递归)
- Nuva 示例代码(每日一帖)之 正则表达式(3)
- Nuva 示例代码(每日一帖)之 正则表达式(2)
- Nuva 示例代码(每日一帖)之 正则表达式(3)
- Nuva 示例代码(每日一帖)之 正则表达式(2)
- Nuva 示例代码(每日一帖)之 正则表达式(1)
- Nuva 示例代码(每日一帖)之 正则表达式(1)
- Nuva 示例代码(每日一帖)之 正则测试器
- Nuva 示例代码(每日一帖)之 简单浏览器
- Nuva 示例代码(每日一帖)之 国际化界面
- Nuva 示例代码(每日一帖)之 模板示例(3)
- Nuva 示例代码(每日一帖)之 异常处理
- Nuva 示例代码(每日一帖)之 添加版权信息
- Nuva 示例代码(每日一帖)之 生成网站地图
- Nuva 示例代码(每日一帖)之 源代码统计
- Nuva 示例代码(每日一帖)之 国际化界面
- Nuva 示例代码(每日一帖)之 ShowMessage
- Nuva 示例代码(每日一帖)之 简单浏览器
- Nuva 示例代码(每日一帖)之 模板示例(1)
- Nuva 示例代码(每日一帖)之 模板示例(3)