Nuva 示例代码(每日一帖)之 正则表达式(3)
<..========================================================
== ==
== Macrobject Nuva Samples ==
== ==
== Copyright (c) 2004-2006 Macrobject Software ==
== ==
== ALL RIGHTS RESERVED ==
== ==
== http://www.macrobject.com ==
== ==
========================================================..>
<.
var text = System.File.Load正则表达式(3).nuva' var regex = System.Text.Regex'(?P<word>\w+)', 's' var match = regex.Matchtext loop
? match.UnmatchedValue
if match.Success var group = match.GroupByName'word' ? '[' ~ group.Index ~ ',' ~ group.Length ~ ']'
? match.Value
match.NextMatch else
exit loop
end if
end loop
.>
<..
【简介】
本例是一个简单的正则表达式程序。
本例的程序读入一个文件(即本例代码),然后进行正则匹配,打印匹配串和未匹配串,并在匹配串的前面插入匹配位置和长度。
【看点】
1、本例演示了字符串的正则操作,其中用到了 System.Text 中的三个类,如下:
Regex:正则类,通过 System.Text.Regex(正则串, [选项]) 创建
如:aregex = System.Text.Regex('\w+', 's')
正则串和选项的介绍请参见前面介绍的其他示例程序
Match:匹配类,通过 Regex.Match(匹配正文) 创建
如:amatch = aregex.Match('aregex.match')
本例中用到了 Match 类的一些方法,如下:
UnmatchedValue,返回最后一次匹配的未匹配串(如果该次匹配成功,则是和上一个匹配串之间的剩余未匹配串)
Success,返回最后一次匹配是否成功
GroupByName,按名字获取相应的匹配组对象
Value,最后一次的匹配串
NextMatch,进行下一次匹配
Group:匹配组类,通过 Match.GroupByName(组名) 创建
如:agroup = amatch.GroupByName('word')
本例中用到了 Group 类的一些方法,如下:
Index,该组的位置(首字符位置)
Length,该组的长度
【扩展】
本例可以进一步扩展以增强其实用性,比如可以在匹配正文中插入更多的信息等。
..>
本例运行结果如下:
<..========================================================
== ==
== [140,10]Macrobject [151,4]Nuva [156,7]Samples ==
== ==
== [252,9]Copyright ([263,1]c) [266,4]2004-[271,4]2006 [276,10]Macrobject [287,8]Software ==
== ==
== [386,3]ALL [390,6]RIGHTS [397,8]RESERVED ==
== ==
== [505,4]http://[512,3]www.[516,10]macrobject.[527,3]com ==
== ==
========================================================..>
<.
[677,3]var [681,4]text = [689,6]System.[696,4]File.[701,4]Load('正则表达式([719,1]3).[723,4]nuva')
[733,3]var [737,5]regex = [745,6]System.[752,4]Text.[757,5]Regex('(?[766,1]P<[768,4]word>\[774,1]w+)', '[781,1]s')
[788,3]var [792,5]match = [800,5]regex.[806,5]Match([812,4]text)
[821,4]loop
? [833,5]match.[839,14]UnmatchedValue
[859,2]if ([863,5]match.[869,7]Success)
[885,3]var [889,5]group = [897,5]match.[903,11]GroupByName('[916,4]word')
? '[' ~ [938,5]group.[944,5]Index ~ ',' ~ [958,5]group.[964,6]Length ~ ']'
? [986,5]match.[992,5]Value
[1013,5]match.[1019,9]NextMatch()
[1036,4]else
[1048,4]exit [1053,4]loop
[1063,3]end [1067,2]if
[1073,3]end [1077,4]loop
.>