parse 支持自顶向下解析,通过rebol的dialect支持实现。可替代正则(regex)
例子 |
说明 |
help sys/*parse-url/rules |
url解析 |
parse input-string [ opt "big" "bird" ] |
opt 可选项,总是返回success |
parse input-string [ "black" space "dog" ] |
space 表示空格,此外还有newline、tab等关键字 |
split "brown dog" " " |
拆分字符串,结果为 [ "brown" "dog" ] |
parse/case "ZZ" [ 2 "Z" ] |
加case表示区分大小写,默认不区分 |
parse {1234567890} [ "123" 5 skip "90" end ] |
skip跳过5个字符 |
parse "bird" [ not "big" "bird" ] |
not 不匹配 |
解析block
当解析对象是一个block,不是string时,会启动datatype的parse
parse [ 12/Dec/2012 2:30pm ] [ date! time! ]
parse [ <div> "Hello" http://rebol.com $1.00 </div> bob@test.com ] [ tag! "Hello" url! money! tag! email! ]
字符集 charset
charset 是字符集,属于bitset,所以匹配速度较快
可以针对charset做集合常见操作,例如union 并、intersection 交、exclude 差、complement 补。
还可以增加内容,例如数字集合加一个.
:digit-dot: insert copy digit "."
copy
注意,copy最终写入第1个参数的内容,取决于第2个参数匹配的情况
set 与 copy 用法类似
检查是否匹配时执行括号内相关代码
参考 R3 Advanced Parse 中 sell/cost 费用的 total price解析例子
while
无限循环:parse input-string [ while [ any "dog" ] ]
while 内部的 subrule 匹配fail时,while循环停止。while自身的返回状态总是success
。
OPT 也类似,返回状态总是 success
break 终止当前block匹配
debug用??
不含|
的word
word-except-bar 不含|
的word,用and
组合实现
高级例子
- 产品收支的解析器:根据每条记录:解析,计算,求和
- rebol/view的vid block 解析器
- parse-analysis.r
- load-parse-tree.r
parse series rules
当series是一个string,就按character解析
当series是一个block,就按value解析
嵌套block解析,用into
例子:把 “Ukiah”, 10:30 提取到info变量
匹配文本 copy text to
- to 一直跳到指定的字符串的首部
- thru 一直跳到指定的字符串的尾部
替换文本
用change/part修改title字段
用change把?
全换成!
用remove / insert / :mark
把 time 换成真正的时间
mark
取出对应的变量值
mark:
把mark置为当前的位置
:mark
表示把 mark指向的内容 插入:mark所标记的位置
参考 chapter 15 - parsing
先匹配123,mark指到4开头,执行括号内容,mark指到6开头,匹配字符串
匹配的内容append到block!
把匹配操作封装成对象
循环提取,append到数组中
递归匹配
REBOL 3 Concepts: Parsing: Recursive Rules
一个四则运算的实现,简短,清晰,漂亮!
匹配次数
- none 是不匹配
- some 是1到多次匹配
- any 是0到多次匹配
替换文本 change/remove/insert
拆分字符串 split
parse 默认自动拆分空格space、制表符tab、换行newline等等不可见字符、逗号comma、分号semicolon
parse/all 不自动空格等字符,会自动拆分;
与,
字符集合
rules的元素组成
REBOL 3 Concepts: Parsing: Summary of Parse Operations
一堆总结列表,备查
rebol的parse是自顶向下解析,TDPL
解析表达式写成block,如果匹配,就更新input position
parse 有2种情况:
- 解析字符串,terminal symbols are characters
- 解析block, terminal symbols are Rebol values
NONE 空
Character 字符
在parse的rule block里可以用()
执行代码
例子:打印 3 行 “great job”
标志后面加:
取出当前位置到末尾的值
解析block
e1 e2 | e3
相当于 [ e1 e2 ] | e3
递归匹配
anbn: [ "a" anbn "b" | "ab" ]
一张parse idioms表格
怎么写parse expression更简洁,重点
参考 parseen.r
用到local变量
use-rule.r
evaluate.r
慎用 change / insert / remove
因为慢