syntax-parse 是一个轻量级语法匹配框架,支持非常复杂的语法嵌套匹配和信息提取。
具体见单元测试案例。
语法名称 | 语法规则 | 语法说明 | 举例 |
---|---|---|---|
任意数字 | [N:a-b] | 表示匹配a-b位数字 | 示例:[N:2-3],[N:0-2] 、[N:2] |
通配符 | [W:a-b] | 表示匹配a-b个任意字符 | 示例:[W:1-2],[W:0-2],[W:2-3] |
通配符否定 | [W:a-b^{xxx}] | 表示匹配a-b个字符且字符不能包含xxx, 其中xxx支持其他任意语法嵌套 |
示例:[W:3-5^{不好}]、[W:1-6^{[不|否]}] |
通配符包含 | [W:a-b~{xxx}] | 表示匹配a-b个字符且字符必须包含xxx, 其中xxx支持其他任意语法嵌套 |
示例:[W:1-2~{好}]、[W:2-3~{[嗯|哦]}] |
通配符限定 | [W:a-b>{xxx}] | 表示匹配a-b个字符且字符必须在xxx中存在, 其中xxx支持其他任意语法嵌套 |
示例:[W:2-3>{[1|2|3|4|5|6|7|8|9|0]}] |
字符串 | xxx | 表示必须完全匹配xxx字符串 | 示例:你好 |
模糊匹配 | [~xxx] | 表示匹配包含xxx字符串 | 示例:~好 |
非必选 | [xxx?] | 表示匹配文本中 xxx 可有可无,非必选存在, 其中xxx支持其他任意语法嵌套 |
示例:[你?]、[[你|他|她]?] |
或 | [A|B|C] | 表示匹配A或者B、C都行, 其中语法支持其他任意语法嵌套 |
示例:[1|2|3|4|[N:1]] |
实体 | [@xxx] | 表示匹配实体,xxx为实体对象, 如系统内置 @sys_location 地点,@sys_time 时间,@sys_name 姓名,@sys_num 量词 |
示例:[@sys_name]、[@sys_location] |
变量 | [#name:xxx] | 表示匹配到的xxx提取出一个name变量, 其中xxx支持其他任意语法嵌套 |
示例:[#age:[N:1-2]]、[#地址:[@sys_location]] |
String dialog = "hi,兄弟。你好,我要买两张从上海前往北京的机票,非常感谢!我要订一张从北京到上海的高铁票啊";
String template = "[W:0-5]" +
"[[我要|帮我][订|买]]" +
"[@sys_num]" +
"从" +
"[#出发地:[@sys_location]]" +
"[出发?]" +
"[到|去|到达|前往]" +
"[#目的地:[@sys_location]]" +
"的" +
"[票|车票|火车票|高铁票|机票|飞机票]" +
"[W:0-5]";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[W:0-5][[我要|帮我][订|买]][@sys_num]从[#出发地:[@sys_location]][出发?][到|去|到达|前往][#目的地:[@sys_location]]的[票|车票|火车票|高铁票|机票|飞机票][W:0-5]
匹配:弟。你好,我要买两张从上海前往北京的机票,非常感谢
变量:{出发地=上海, 目的地=北京}
匹配:我要订一张从北京到上海的高铁票啊
变量:{出发地=北京, 目的地=上海}
// 时间
String template = "[@sys_time]";
String dialog = "公元21年,我今天下午去喝酒,大概要晚上九点才回来,他们是在阴历八月初六举行婚礼,那天正好周六,阳历9月21号,现在北京时间2022年09月3号16点54分1秒,二零二二年九月三号";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[@sys_time]
匹配:公元21年
匹配:今天下午
匹配:晚上九点
匹配:阴历八月初六
匹配:周六
匹配:阳历9月21号
匹配:2022年09月3号16点54分1秒
匹配:二零二二年九月三号
// 地标
String template = "[@sys_location]";
String dialog = "我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?" +
"我们去杭州玩吧?不,我想去深圳或者广州,这有啥好玩的,还不如一起去**呢,或者西藏。" +
"对了,上海有啥玩的,东方明珠塔,中心大厦,世纪公园啥的,都没啥玩的,本地人从来不去。" +
"你家住哪?我家在浦东新区xxx路101号楼202房间,不对我搬家了,是在302房间。" +
"**城市排行榜,北上广深位列前四,广东江苏山东浙江这几个省gdp增速最高";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:[@sys_location]
匹配:上海闵行区茸锦科技园A栋1001室
匹配:杭州
匹配:深圳
匹配:广州
匹配:**
匹配:西藏
匹配:上海
匹配:东方明珠塔
匹配:中心大厦
匹配:世纪公园
匹配:浦东新区xxx路101号楼202房间
匹配:302房间
匹配:**城市
匹配:广东
匹配:江苏
匹配:山东
匹配:浙江
String template = "我[想|要|[W:0-1]][从|去|到|前往][#目的地:[@sys_location]][W:0-2][请问|敢问]该[怎么|如何]走[??]";
String dialog = "你好,我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?" +
"左边右转一公里就能到。" +
"兄弟,我想前往茸锦科技园A栋,敢问该怎么走" +
"不知道";
matchDialog(dialog, template);
匹配结果
---------------------------
模板:我[想|要|[W:0-1]][从|去|到|前往][#目的地:[@sys_location]][W:0-2][请问|敢问]该[怎么|如何]走[??]
匹配:我要到上海闵行区茸锦科技园A栋1001室,请问该如何走?
变量:{目的地=上海闵行区茸锦科技园A栋1001室}
匹配:我想前往茸锦科技园A栋,敢问该怎么走
变量:{目的地=茸锦科技园A栋}
项目的发展离不开您的支持,请作者喝杯咖啡吧~
ps:辣条也行 ☕