# words
# Description
拆分字符串 string
中的词为数组
# Params
(string, pattern)
{string} [string=''] 要拆分的字符串
[pattern] 匹配模式
# Return
Array
# Depend
import unicodeWords from './.internal/unicodeWords.js'
# Code
const hasUnicodeWord = RegExp.prototype.test.bind(
/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/
)
/** Used to match words composed of alphanumeric characters. */
const reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g
function asciiWords(string) {
return string.match(reAsciiWord)
}
function words(string, pattern) {
if (pattern === undefined) {
const result = hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string)
return result || []
}
return string.match(pattern) || []
}
# Analyze
# 正则
hasUnicodeWord
reAsciiWord
-- 用于匹配由字母数字字符组成的单词
- 定义
asciiWords
方法,用于ascii
字符的分割, 基于reAsciiWord
正则 - 首先判断是否传入了
pattern
校验规则, 用的是===
, 传null
的也会走自定义的逻辑 - 如果传入了则使用
pattern
进行match
, 有结果时返回 结果数组,没有结果返回 空数组 - 如果没有传入则使用默认的正则进行
match
- 这里进行了
hasUnicodeWord
的判断,这个正则判断的规则,满足以下条件的都会调用unicodeWords
,否则调用asciiWords
- 存在 小写字母后紧跟大写字母
[a-z][A-Z]
, e.g:aA
- 存在 两个大写字母后跟小写字母
[A-Z]{2}[a-z]
, e.g:AAa
- 存在 数字后跟字母
[0-9][a-zA-Z]
, e.g:0A
- 存在 字母后跟数组
[a-zA-Z][0-9]
, e.g:A0
- 不在 字母数字和空格之内
[^a-zA-Z0-9 ]
, e.g:|
- 存在 小写字母后紧跟大写字母
- 拿到
match
的结果,如果存在就返回,否则返回空数组
# Remark
- test MDN (opens new window)
- Strict equality (===) MDN (opens new window) -- ECMA (opens new window)
- 相等(==) MDN (opens new window)
==
和===
区别- 如果操作数的类型不同,则返回 false。
- 如果两个操作数都是对象,只有当它们指向同一个对象时才返回 true。
- 如果两个操作数都为 null,或者两个操作数都为 undefined,返回 true。
- 如果两个操作数有任意一个为 NaN,返回 false。
- 否则,比较两个操作数的值:
- 数字类型必须拥有相同的数值。+0 和 -0 会被认为是相同的值。
- 字符串类型必须拥有相同顺序的相同字符。
- 布尔运算符必须同时为 true 或同时为 false。
全等运算符与相等运算符(==)最显著的区别是,如果操作数的类型不同,==
运算符会在比较之前尝试将它们转换为相同的类型
被比较值 B | |||||||
---|---|---|---|---|---|---|---|
Undefined | Null | Number | String | Boolean | Object | ||
被比较值 A | Undefined | true | true | false | false | false | IsFalsy(B) |
Null | true | true | false | false | false | IsFalsy(B) | |
Number | false | false | A === B | A === ToNumber(B) | A=== ToNumber(B) | A== ToPrimitive(B) | |
String | false | false | ToNumber(A) === B | A === B | ToNumber(A) === ToNumber(B) | ToPrimitive(B) == A | |
Boolean | false | false | ToNumber(A) === B | ToNumber(A) === ToNumber(B) | A === B | ToNumber(A) == ToPrimitive(B) | |
Object | false | false | ToPrimitive(A) == B | ToPrimitive(A) == B | ToPrimitive(A) == ToNumber(B) | A === B |
# Example
hasUnicodeWord('I want to go to sleep') // false
hasUnicodeWord('I want to go to sleep.') // true
words('I want to go to sleep') // [ 'I', 'want', 'to', 'go', 'to', 'sleep' ]
words('I want to go to sleep.') // [ 'I', 'want', 'to', 'go', 'to', 'sleep' ]