您的位置:首页 > 编程语言

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 --
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: