gpt4 book ai didi

使用变音符号匹配单词边界的 JavaScript 正则表达式

转载 作者:行者123 更新时间:2023-11-30 19:44:43 26 4
gpt4 key购买 nike

我必须在文本文档中匹配具有变音符号的单词的单词边界。给定一个 word 标记,我的正则表达式看起来像

var wordRegex = new RegExp("\\b(" + word + ")\\b", "g");
while ((match = wordRegex.exec(text)) !== null) {
if (match.index > (seen.get(token) || -1)) {
var wordStart = match.index;
var wordEnd = wordStart + token.length - 1;
item.characterOffsetBegin = wordStart;
item.characterOffsetEnd = wordEnd;

seen.set(token, wordEnd);
break;
}
}

这适用于像 ciaocasa 等普通词。但是当我在文本中有像 però 这样的词时,它就不起作用了>、così

const seen = new Map();
var text = "Ci son macchine nascoste e, però, nascoste male"
var tokens = text.split(/[^a-zA-Z0-9àèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]+/i)
tokens.forEach((token, tokenIndex) => {
var item = {
"index": (tokenIndex + 1),
"word": token
}
var escaped = token.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
var wordRegex = new RegExp("\\b(" + escaped + ")\\b", "g");
var match = null;
console.log(token, "---->", wordRegex)
while ((match = wordRegex.exec(text)) !== null) {
console.log("\t---->", match.index)
if (match.index > (seen.get(token) || -1)) {
var wordStart = match.index;
var wordEnd = wordStart + token.length - 1;
item.characterOffsetBegin = wordStart;
item.characterOffsetEnd = wordEnd;

seen.set(token, wordEnd);
break;
}
}
})

你可以看到一些单词(比如 macchinenascoste)是如何匹配的,所以我得到了 match.index,对于其他单词(如 però)正则表达式无法正常工作并且 match 变量为 null:

macchine ----> /\b(macchine)\b/g
----> 7
nascoste ----> /\b(nascoste)\b/g
----> 16
e, ----> /\b(e\,)\b/g
però, ----> /\b(però\,)\b/g
nascoste ----> /\b(nascoste)\b/g
----> 16
----> 34

那么如何编写一个支持变音符号的边界正则表达式呢?

[更新]按照评论中建议的方法,在应用 Regex 之前,我对每个单词 token 使用了变音符号删除,然后对整个 text 进行了删除,例如:

var normalizedText = removeDiacritics(text);
// for each token...
var escaped = token.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
escaped = removeDiacritics(escaped);
var wordRegex = new RegExp("\\b(" + escaped + ")\\b", "g");
var match = null;
while ((match = wordRegex.exec( normalizedText )) !== null)
{
//...

这一次我将得到带有 \b 单词边界捕获的重音的单词。当然,这种方法不是最优的,因为 removeDiacritics 必须应用于每个标记,所以最好的解决方案是执行一次。

最佳答案

这是我们在评论中提出的将具有变音符号的单词映射到它们在文本中的索引的解决方案:

function removeDiacritics(text) {
return _.deburr(text)
}

const seen = new Map();
var text = "Ci son macchine nascoste e, però, nascoste male"
var tokens = text.split(/[^a-zA-Z0-9àèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]+/i)
var normalizedText = removeDiacritics(text)

tokens.forEach((token, tokenIndex) => {
var item = {
"index": (tokenIndex + 1),
"word": removeDiacritics(token)
}
var escaped = token.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&");
escaped = removeDiacritics(escaped)
var wordRegex = new RegExp("\\b(" + escaped + ")\\b", "g");
var match = null;
console.log(token, "---->", wordRegex)
while ((match = wordRegex.exec(normalizedText)) !== null) {
console.log("\t---->", match.index)
if (match.index > (seen.get(token) || -1)) {
var wordStart = match.index;
var wordEnd = wordStart + token.length - 1;
item.characterOffsetBegin = wordStart;
item.characterOffsetEnd = wordEnd;

seen.set(token, wordEnd);
break;
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

关于使用变音符号匹配单词边界的 JavaScript 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com