Golang正则笔记 :使用正则表达式处理题库文本
前言
由于企业内部的一些考试需要,有些同事要时常通过一个word格式的题库文件来查询相应题目,但在手机上用word进行查询,总觉得操作上很不方便。借着这个契机,应用Golang和Kotlin开发了一个小工具,方便同事可快捷的查询题目。
也是希望把开发过程中的知识点记录下来,方便以后复习,因为不知道什么时候就会又一次忘了怎么写正则了。
虽然上面说了那么多,其实就是想帮同事作弊 ლ(╹◡╹ლ)
题库文件参考
以下是我的题库文件,可参考: tiku.txt
单选题: (共912小题,总分:1分)1 . ( )是银行网点直接和顾客接触的员工,因此在客户建立对银行网点第一印象、维持良好的银行网点服务形象方面起着重要作用 (1.50分)
A 网点负责人
B 大堂经理
C 柜员
D 客户经理
标准答案 :C
试题解析 :
1,065 . 柜员柜面营销与柜面服务包括 (2分)
A 负责业务办理间隙识别优质客户的工作,并将客户引导到最合适的服务渠道
B 保持头、脸、手、着装、修整、饰物的清洁、规范,保持职业化服务形象
C 执行站姿挺拔、坐姿端庄、行姿规范、行为检点、微笑亲和、致意得体、道歉真诚的服务要求,保持良好服务行为
D 执行声音亲和、语句清晰、措辞客气、表达明了、称呼准确、问候得体、适当寒暄的服务语言规范
E 负责详细记录客户信息,聆听、发现客户真实需求,为下一步客户经理的关系维护打下基础
标准答案 :A B C D E
试题解析 :
1,480 . 根据我社其它物品管理的规定,对于印章和钥匙,对应的调拨机构为上级管理机构,而假币上缴的对应上级机构为现金管理(分)中心。 (1分)
正确
错误
标准答案 :正确复制代码
需求就是将这个文件,保存为sqlite数据库文件,并嵌到Android App里。
第一步,使用正则表达式解析文件,并拆分出题干,选项,答案几个元素,再分别存入数据库里。
正则我用Golang实现,数据库用sqlite ,因为最后这个数据库是要给Android用的。
一: 先分析题干部分:
1 . ( )是银行网点直接和顾客接触的员工,因此在客户建立对银行网点第一印象、维持良好的银行网点服务形象方面起着重要作用 (1.50分)
可分为三个部分来解析
- 题序:[ 1 . ]
正则表达:
完整的正则: ^\s*?(?P<index>\d+,*?\d*?\s*?\.)\s*?^\s*? 表示以0或1个以上的空格开头 ,^表示匹配开头(?P<index>) 是golang的分组语法,在这里不用理会\d+,*?\d*?\s*?\.
\d+ : 表示1个以上的数字
,*? : 0或1个逗号 , 因文本里的题序格式类似这样: 1,234 ,这个正则不支持 1,234,567 ,因为我觉得不太可能需要那么大的数
\d*? : 表示0个以上的数字
\s*?\. : 若干空格并以 . 结束
复制代码
Golang 实现:
func findSubject(line string) (result bool, s string) {reg := regexp.MustCompile(`^\s*?(?P<index>\d+,*?\d*?\s*?\.)\s*?(?P<subject>.*)(?P<score>\s*?(.*分))$`)matches := reg.FindStringSubmatch(line)if len(matches) > 0 {return true, matches[2]}return false, ""
}
复制代码
- 题干正文 : [( )是银行网点直接和顾客接触的员工,因此在客户建立对银行网点第一印象、维持良好的银行网点服务形象方面起着重要作用 ]
分析题干需要同时配合结尾来进行解析,可以明显的看到,每道题都以(1.50分)这样的格式结尾(?P<subject>.*)(?P<score>\s*?(.*分))$
复制代码
二: 分析选项:
^\s?(?P<index>[A-Z]\s?)\s?(?P<content>.*)选项总是以字母开头,所以用 [A-Z] 匹配即可。
复制代码
Golang 实现:
func findOptions(line string) (result bool, s string) {//判断选择题reg := regexp.MustCompile(`^\s?(?P<index>[A-Z]\s?)\s?(?P<content>.*)`)matches := reg.FindStringSubmatch(line)if len(matches) > 0 {return true, line}reg = regexp.MustCompile(`^(正确)|^(错误)`) //这里需要注意,判断题并不是以[A-Z]开头的。matches = reg.FindStringSubmatch(line)if len(matches) > 0 {return true, matches[0]}return false, ""
}
复制代码
分析答案就太简单了:
func findAnswer(line string) (result bool, s string) {matched, _ := regexp.MatchString(`^(标准答案 :)`, line)if matched {return true, line}return false, ""
}
复制代码
不多说了,最后就是保存进sqlite了
func saveToDB() {db, err := sql.Open("sqlite3", "./yee.db")checkErr(err)for _, q := range questionList {stmt, err := db.Prepare(`INSERT INTO question(subject, options, answer) values(?,?,?)`)checkErr(err)res, err := stmt.Exec(q.Subject, strings.Join(q.Options, "||"), q.Answer) //选项之间用 || 分隔即可,简单处理checkErr(err)id, err := res.LastInsertId()checkErr(err)fmt.Println(id)}
}复制代码
完整代码请参考Gayhub: https://github.com/yeelone/bankolin-demo
第二步,实现Android App
将第一步生成的 yee.db 数据库文件放进新建的Android项目里,目录为 src/main/res/raw ,
接着我们需要在APP启动时,将yee.db文件拷进android的数据文件地址
先实现一个Helper类并为context进行扩展:
package com.example.elone.myapplicationimport android.content.Context
import android.database.sqlite.SQLiteDatabase
import org.jetbrains.anko.db.ManagedSQLiteOpenHelperclass DatabaseHelper(ctx: Context) : ManagedSQLiteOpenHelper(ctx, "yee.db", null, 1) {companion object {private var instance: DatabaseHelper? = null@Synchronizedfun Instance(context: Context): DatabaseHelper {if (instance == null) {instance = DatabaseHelper(context.applicationContext)}return instance!!}}override fun onCreate(database: SQLiteDatabase) {}override fun onUpgrade(database: SQLiteDatabase, oldVersion: Int, newVersion: Int) {}
}val Context.database: DatabaseHelperget() = DatabaseHelper.Instance(applicationContext)
复制代码
再接着回到MainActivity
private fun importDatabase() {// 存放数据库的目录var dirPath = "/data/data/"+PACKAGE_NAME+"/databases"var dir = File(dirPath)if (!dir.exists()) {dir.mkdir()}// 数据库文件var file = File(dir, "yee.db")try {if (!file.exists()) {file.createNewFile()}// 加载需要导入的数据库var instream: InputStream = this.applicationContext.resources.openRawResource(R.raw.yee)var fos = FileOutputStream(file)var buffer = ByteArray(instream.available())instream.read(buffer)fos.write(buffer)instream.close()fos.close()} catch ( e: FileNotFoundException) {e.printStackTrace()}}
复制代码
这是第一次用到kotlin Anko sqlite,记录一下查询语法:
private fun searchQuestion() {val editText = findViewById<EditText>(R.id.searchText)val rows = database.use {select("question").whereSimple("(subject like '%"+editText.text+"%') ").exec {parseList(classParser<Question>())}}mListView.adapter = MainAdapter(rows)}
复制代码
最终成果如图:
欢迎访问原文地址: Github Page
转载于:https://juejin.im/post/5b1952f6f265da6e372e911c
Golang正则笔记 :使用正则表达式处理题库文本相关推荐
- 爬虫笔记7正则表达式与re库
0.导学 0.正则表达式的概念 优势:简结 用于字符串匹配 1.正则表达式的语法 2.Re库的基本使用 raw string 中 \ 不认为为转义符 import re match= re.searc ...
- 这是一篇男女老少入门精通咸宜的正则笔记
前言 说句实话的,自从我整理这篇笔记后,基本上项目里遇到的所有正则匹配的问题,不论多复杂,只要回过头看这篇笔记,理解透彻(请注意我的用词描述,我这里描述比较严谨,理解好中文意思更方便你理解正则意义.这 ...
- 计算机原理考研题库,2022考研853计算机专业基础综合《计算机组成原理》复习笔记及考研真题题库.pdf...
2022考研 853计算机专业基础综合 <计算机组成原理>复习笔记及考 研真题题库 计算机系统概论 一.计算机的分类 1电子模拟计算机 模拟计算机的特点是数值由连续量来表示,运算过程也是连 ...
- (附思维导图+笔记)-六面美团后,我发现大厂面试真的有“题库”!
从去年到今年先后面试了 6 次美团,外卖.订单.商旅面试了好几个部门.总结下来面试的大体思路真的基本一致诶.比如: JVM 参数配置.常用调试工具.分区.类加载,还会问你有需要线上的调试问题吗?遇到死 ...
- [杨可桢]机械设计基础题库 机械设计基础习题 2022机械设计基础考试题答案 杨可桢《机械设计基础》(第7版)笔记和课后习题(含考研真题)详解
[杨可桢]机械设计基础题库 机械设计基础习题 2022机械设计基础考试题答案-硕达学习网 杨可桢<机械设计基础>(第7版)笔记和课后习题(含考研真题)详解 目录 第1章 平面机构的自由 ...
- 牛客网-SQL题库笔记
牛客网-SQL题库笔记 01.最晚入职员工的所有信息 02.查找入职员工时间排名倒数第三的员工所有信息 03.查找各个部门当前领导当前薪水详情以及其对应部门编号 04.查找所有已经分配部门的员工的la ...
- CCNA精品学习资料汇总(学习手册+笔记+题库)
CCNA精品学习资料汇总(学习手册+笔记+题库) CCNA认证标志着具备安装.配置.运行中型路由和交换网络,并进行故障排除的能力.获得CCNA认证的专业人士拥有相应的知识和技能,能够通过广域网与 ...
- 全国计算机等级考试二级Python精品题库学习笔记1
全国计算机等级考试二级Python精品题库学习笔记1 精品试卷01 精品试卷01程序题 基本操作题 2:随机验证码 基本操作题 3:比赛成绩计算 Turtle 绘图题:同心圆 简单应用题 2:员工工资 ...
- 理工科题库创建与Office Word数据交换笔记
笔记 OMML 模型是实现 Office Math 功能的标记语言 文本转换图片的相关库合集:https://xosh.org/text-to-diagram/ 开源实例 目前尝试的开源项目,基本没有 ...
最新文章
- hadoop之 YARN配置参数剖析—RM与NM相关参数
- 《认清C++语言》的random_shuffle()和transform()算法
- AttributeError: ‘list‘ object has no attribute ‘ndim‘
- 我的世界java什么村民卖地图_《我的世界》推出虚拟货币、商店 玩家可在店中卖地图...
- 循环链表:拉丁方阵问题
- CODE:BLOCK中的CreateProcess: No such file or directory
- 项目经理:赢得项目不是终点而是起点
- HTTP权威指南笔记
- html写手机登录界面,使用HTML做手机端的登录界面
- Android性能测试工具(一) 之Emmagee[转载]
- 51单片机矩阵键盘控制数码管
- linux mint五笔输入法,Linux Mint安装ibus五笔和拼音输入法简明教程
- 大数元科技牵手中央财经大学 助力财税金融体制改革
- ShowWindow函数
- 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
- bcm4322linux驱动下载,苹果MAC BOOK PRO 5.5 2009年中 安装fedora26——broadcom BCM4322 无线驱动在fedora上的安装...
- 电脑Svchost.exe 进程占CPU100% 的解决办法
- Java基本语法(初学者必看,值得收藏)
- 预付费水电表系统功能有哪些?
- TCP/IP协议概念通俗讲解, 端口号与套接字的区别