正则基础--句子拆分成单词

114 阅读3分钟

背景

绘本句子的单词支持点击,并出现单词释义。

由于服务端下发的是一整个完整句子,因此需要将句子拆分成单词。这就涉及到正则表达

的知识了。

正则表达式定义

通常用斜杠/ /包裹,如/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 可以分为三个部分:

  1. [\w']+:匹配一个或多个连续的字母、数字或下划线字符,或者单引号 '。

  1. [^\w\s]+:匹配一个或多个连续的非字母、非数字、非下划线和非空白字符。

  1. \s:匹配一个空白字符。

a-zA-Z

看到上面第二部分[^\w\s]+匹配到的是符号,不是单词释义吗,为什么要匹配符号?开头说过,服务端下发的是一整句绘本,我们需要完成的还原到页面上。所以最后点击单词出现释义窗口时,要判断,如果点击的不是单词则不响应。

  • a-z匹配26个小写字母
  • A-Z匹配26个大写字母
regExp = /[a-zA-Z]+/;
isWord = regExp.test(word);
if(!isWord){
  所选项中不存在字母,则不是单词
}