我有一个字符串:
const str = 'a string, a long string'
我想将其分解为单词(这里没问题),然后跟踪原始字符串中每个单词的索引。
实际结果:
[
{ word: 'a', idx: 0 },
{ word: 'string', idx: 2 },
{ word: 'a', idx: 0 },
{ word: 'long', idx: 12 },
{ word: 'string', idx: 2 }
]
期望的结果:
[
{ word: 'a', idx: 0 },
{ word: 'string', idx: 2 },
{ word: 'a', idx: 10 },
{ word: 'long', idx: 12 },
{ word: 'string', idx: 17 }
]
到目前为止的代码:
const str = 'a string, a long string'
const segmenter = new Intl.Segmenter([], { granularity: 'word' })
const getWords = str => {
const segments = segmenter.segment(str)
return [...segments]
.filter(s => s.isWordLike)
.map(s => s.segment)
}
const words = getWords(str)
const result = words.map(word => ({
word,
idx: str.indexOf(word)
}))
console.log(result)
您正在迭代的对象包含 ,并且
segment
无论是否包含isWordLike
,也包含index
:这是类型定义:
String.matchAll
也许是一个用于检索单词和索引的想法。或者只是减少
Intl.Segmenter.segment
结果。就像是:
您可以尝试使用正则表达式,它比分段器快 25 倍:
我将您的字符串分解为包含单词和单词索引的对象数组。
如果您希望标点符号作为单词,您可以使用正则表达式。