前言

由于企业内部的一些考试需要,有些同事要时常通过一个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. 题序:[ 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. 题干正文 : [( )是银行网点直接和顾客接触的员工,因此在客户建立对银行网点第一印象、维持良好的银行网点服务形象方面起着重要作用 ]
分析题干需要同时配合结尾来进行解析,可以明显的看到,每道题都以(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正则笔记 :使用正则表达式处理题库文本相关推荐

  1. 爬虫笔记7正则表达式与re库

    0.导学 0.正则表达式的概念 优势:简结 用于字符串匹配 1.正则表达式的语法 2.Re库的基本使用 raw string 中 \ 不认为为转义符 import re match= re.searc ...

  2. 这是一篇男女老少入门精通咸宜的正则笔记

    前言 说句实话的,自从我整理这篇笔记后,基本上项目里遇到的所有正则匹配的问题,不论多复杂,只要回过头看这篇笔记,理解透彻(请注意我的用词描述,我这里描述比较严谨,理解好中文意思更方便你理解正则意义.这 ...

  3. 计算机原理考研题库,2022考研853计算机专业基础综合《计算机组成原理》复习笔记及考研真题题库.pdf...

    2022考研 853计算机专业基础综合 <计算机组成原理>复习笔记及考 研真题题库 计算机系统概论 一.计算机的分类 1电子模拟计算机 模拟计算机的特点是数值由连续量来表示,运算过程也是连 ...

  4. (附思维导图+笔记)-六面美团后,我发现大厂面试真的有“题库”!

    从去年到今年先后面试了 6 次美团,外卖.订单.商旅面试了好几个部门.总结下来面试的大体思路真的基本一致诶.比如: JVM 参数配置.常用调试工具.分区.类加载,还会问你有需要线上的调试问题吗?遇到死 ...

  5. [杨可桢]机械设计基础题库 机械设计基础习题 2022机械设计基础考试题答案 杨可桢《机械设计基础》(第7版)笔记和课后习题(含考研真题)详解

    [杨可桢]机械设计基础题库  机械设计基础习题  2022机械设计基础考试题答案-硕达学习网 杨可桢<机械设计基础>(第7版)笔记和课后习题(含考研真题)详解 目录 第1章 平面机构的自由 ...

  6. 牛客网-SQL题库笔记

    牛客网-SQL题库笔记 01.最晚入职员工的所有信息 02.查找入职员工时间排名倒数第三的员工所有信息 03.查找各个部门当前领导当前薪水详情以及其对应部门编号 04.查找所有已经分配部门的员工的la ...

  7. CCNA精品学习资料汇总(学习手册+笔记+题库)

       CCNA精品学习资料汇总(学习手册+笔记+题库) CCNA认证标志着具备安装.配置.运行中型路由和交换网络,并进行故障排除的能力.获得CCNA认证的专业人士拥有相应的知识和技能,能够通过广域网与 ...

  8. 全国计算机等级考试二级Python精品题库学习笔记1

    全国计算机等级考试二级Python精品题库学习笔记1 精品试卷01 精品试卷01程序题 基本操作题 2:随机验证码 基本操作题 3:比赛成绩计算 Turtle 绘图题:同心圆 简单应用题 2:员工工资 ...

  9. 理工科题库创建与Office Word数据交换笔记

    笔记 OMML 模型是实现 Office Math 功能的标记语言 文本转换图片的相关库合集:https://xosh.org/text-to-diagram/ 开源实例 目前尝试的开源项目,基本没有 ...

最新文章

  1. hadoop之 YARN配置参数剖析—RM与NM相关参数
  2. 《认清C++语言》的random_shuffle()和transform()算法
  3. AttributeError: ‘list‘ object has no attribute ‘ndim‘
  4. 我的世界java什么村民卖地图_《我的世界》推出虚拟货币、商店 玩家可在店中卖地图...
  5. 循环链表:拉丁方阵问题
  6. CODE:BLOCK中的CreateProcess: No such file or directory
  7. 项目经理:赢得项目不是终点而是起点
  8. HTTP权威指南笔记
  9. html写手机登录界面,使用HTML做手机端的登录界面
  10. Android性能测试工具(一) 之Emmagee[转载]
  11. 51单片机矩阵键盘控制数码管
  12. linux mint五笔输入法,Linux Mint安装ibus五笔和拼音输入法简明教程
  13. 大数元科技牵手中央财经大学 助力财税金融体制改革
  14. ShowWindow函数
  15. 在计算机硬盘使用前需要做的工作是,工作电脑的硬盘该如何保养
  16. bcm4322linux驱动下载,苹果MAC BOOK PRO 5.5 2009年中 安装fedora26——broadcom BCM4322 无线驱动在fedora上的安装...
  17. 电脑Svchost.exe 进程占CPU100% 的解决办法
  18. Java基本语法(初学者必看,值得收藏)
  19. 预付费水电表系统功能有哪些?
  20. TCP/IP协议概念通俗讲解, 端口号与套接字的区别

热门文章

  1. AI一分钟 | 网信办暂停快手、火山小视频算法推荐功能;无需人类司机,加州将允许自动驾驶汽车接送乘客
  2. 如何用Python处理分类和回归问题?附方法和代码
  3. 资源 | 一文读懂深度学习(附学习资源)
  4. 高并发下秒杀商品,你必须知道的9个细节
  5. Lombok 使用详解,简化 Java 编程
  6. Java并发编程73道面试题及答案——稳了
  7. 【廖雪峰python入门笔记】布尔运算和短路计算
  8. 机器学习中四种调参方法总结
  9. 让你的 IDEA 好用到飞起来的配置
  10. 用Python分析了582个专业,1281个本科院校,告诉你怎么选择?