如何将一个有空格和标点的句子分割成单词,这样我就可以像在vim中那样使用动作



我正在构建一个vim编辑器,并希望做运动,如移动到单词的开头,单词的结尾和下一个单词的开始。

我想我应该把这行分成几个词,这样我就能得到一些上下文。所以:

我有这个字符串:

Assign "Caps-Lock" to "Ctrl", and "Tab" to "Escape" to use the commands easier.

我想把它分成如下内容:

[`Assign`,` "`,`Caps`,`-`,`Lock`,`" `,`to`,` "`,`Ctrl`, .... ", and "Tab" to "Escape" to use the commands easier.

一个规则是不要在分割数组中丢失任何字符。第二条规则是按单词、空格和标点符号分组。不管vim怎么做

我尝试了各种正则表达式都失败了,例如这吃空格:

function wordize(line: string) {
return line.match(/[?!.]|w+/g)
}

这里有一些代码可以帮助实现我想要的,如果有任何错误,请告诉我,或者有一个更整洁的解决方案。

function out_of_ctx(p: string, n: string) {
let w = !!p.match(/[a-zA-Z0-9]/),
wn = !!n.match(/[a-zA-Z0-9]/)
return (w !== wn)
}
// TODO cache
function wordize(line: string) {
let res = []
let ctx = ''
for (let i = 0; i < line.length - 1; i++) {
ctx += line[i]
if (out_of_ctx(line[i], line[i+1])) {
res.push(ctx)
ctx = ''
}
}
ctx += line[line.length - 1]
if (ctx !== '') {
res.push(ctx)
}
return res
}
function words_n(words: Array<string>, n: number) {
let res = 0
for (let i = 0; i < words.length; i++) {
res += words[i].length
if (res - 1 >= n) {
return i
}
}
}
function words_count(words: Array<string>, n: number) {
let res = 0
for (let i = 0; i <= n; i++) {
res += words[i].length
}
return res
}
function beginning_of_word(line: string, n: number) {
let wz = wordize(line)
let i = words_n(wz, n)
return words_count(wz, i-1)
}
function end_of_word(line: string, n: number) {
let wz = wordize(line)
let i = words_n(wz, n)
return words_count(wz, i) - 1
}
function start_of_next_word(line: string, n: number) {
let wz = wordize(line)
let i = words_n(wz, n)
return words_count(wz, i)
}

相关内容

最新更新