背景
绘本句子的单词支持点击,并出现单词释义。
由于服务端下发的是一整个完整句子,因此需要将句子拆分成单词。这就涉及到正则表达
的知识了。
正则表达式定义
通常用斜杠/ /包裹,如/abc/ 但不是所有编程语言都这么写,小程序wxs 需要写成getRegExp('abc')
匹配句子空格拆分成单词
因为每个单词之间是有空格分隔的,要将句子拆分成一个个单词,首先想到的是空格拆分。
普通字符\s
匹配空白字符,包括空格、制表符、换页符等等(记忆:space的意思)
用正则可视化工具查看一下
特殊字符+
单词和单词之间,不一定只有一个空格,怎么表示一个或多个空格呢?
现在就可以把句子拆分成单词了
- 问题1
上面的结果中 Start. 单词和标点匹配到了一起,原句子他们中间没有空格。
可以在最后获取单词释义时,用replace替换掉Star.中的符号
但是这需要列举完全,因为句子结尾的符号可能是. ? ! 等
- 问题2
虽然问题1可以基本解决,但是测试发现,还有些绘本句子配置成这样
Hello 和 I’m之间居然没有空格,导致查单词是传入HelloI’m,无疑是查不出来的。因此,决定换一种拆分单词方式
匹配word拆分成单词
最终的正则式:/[\w']+|[^\w\s]+|\s/g
正则验证工具 regex101.com/r/a9fwUw/1
特别字符 |
两项之间的一个选择
普通字符\w
匹配word(字母、数字、下划线)
字符 [ ]
匹配 [] 中的所有字符
字符^
匹配字符串的开始位置,但是和【】搭配,表示不接受方括号里的字符
字符 [^ ]
匹配除了括号内的字符以外的任意一个字符
修饰符 g
global - 全局匹配
不加全局修饰符查找一次就会终止
综上
这个正则表达式 /[\w']+|[^\w\s]+|\s/g 可以分为三个部分:
-
[\w']+:匹配一个或多个连续的字母、数字或下划线字符,或者单引号 '。
-
[^\w\s]+:匹配一个或多个连续的非字母、非数字、非下划线和非空白字符。
-
\s:匹配一个空白字符。
a-zA-Z
看到上面第二部分[^\w\s]+匹配到的是符号,不是单词释义吗,为什么要匹配符号?开头说过,服务端下发的是一整句绘本,我们需要完成的还原到页面上。所以最后点击单词出现释义窗口时,要判断,如果点击的不是单词则不响应。
- a-z匹配26个小写字母
- A-Z匹配26个大写字母
regExp = /[a-zA-Z]+/;
isWord = regExp.test(word);
if(!isWord){
所选项中不存在字母,则不是单词
}