Javascript 将字符串解析为没有英文字符和发音的单词
我试图在Javascript中将字符串拆分为单个单词的数组。第一步很简单:Javascript 将字符串解析为没有英文字符和发音的单词,javascript,string,parsing,Javascript,String,Parsing,我试图在Javascript中将字符串拆分为单个单词的数组。第一步很简单: words = text.split(/\b\s+(?!$)/); 除了不使用标点符号作为分隔符外,此解决方案工作正常。例如写“你好!你好吗?”,在单词数组中,我发现“你好!”、“你好”、“你好”、“你呢?” 我用一个不太优雅的解决方案解决了这个问题(但它是有效的!) 但仍然存在一个大问题。如果str包含任何非英语字符(例如意大利语字符ò、á、ù、ù),则方法split不会分割单词 例如,如果文本是“Perchései
words = text.split(/\b\s+(?!$)/);
除了不使用标点符号作为分隔符外,此解决方案工作正常。例如写“你好!你好吗?”,在单词数组中,我发现“你好!”、“你好”、“你好”、“你呢?”
我用一个不太优雅的解决方案解决了这个问题(但它是有效的!)
但仍然存在一个大问题。如果str包含任何非英语字符(例如意大利语字符ò、á、ù、ù),则方法split不会分割单词
例如,如果文本是“Perchései partito?”,则“Perchései”被拆分为数组单词的单个元素(就像它是单个单词一样)
有解决办法吗?非常感谢你的帮助 有关删除标点符号的更优雅的解决方案,请参见此处:
为解决您的重音字符问题,请考虑使用以下正则表达式:
(?=\w|\W)\s+
不过,这一个选择了空换行符,但如果您使用我链接的问题中的顶级解决方案,这应该足以解决您的问题:
(?=\w|\W)\s
有关删除标点符号的更优雅的解决方案,请参见此处:
为解决您的重音字符问题,请考虑使用以下正则表达式:
(?=\w|\W)\s+
不过,这一个选择了空换行符,但如果您使用我链接的问题中的顶级解决方案,这应该足以解决您的问题:
(?=\w|\W)\s
通过使用,可以创建数组。但是,您可以使用match
返回单词数组,而不是使用split(尝试按匹配项拆分字符串)
var wordsRegex = /([^\x00-\x7F]|\w)+/g;
var sentence = 'Hello! How are you?';
console.log(sentence.match(wordsRegex)); //=> ['Hello', 'How', 'are', 'you']
sentence = 'Perché sei partito?';
console.log(sentence.match(wordsRegex)); //=> ['Perché', 'sei', 'partito']
不过,您需要注意的一点是,正则表达式只考虑英语标点符号,因此如果字符串包含拉丁语标点符号(例如
),则会在结果中得到这些标点符号
sentence = 'Perché sei partito¡';
console.log(sentence.match(wordsRegex)); //=> ['Perché', 'sei', 'partito¡']
如果需要排除非英语标点符号,可以向正则表达式中添加任何要排除的标点符号。如果你想排除所有可能的非英语字符和英语字符,你会得到一个相当大的正则表达式,所以你可能只想考虑排除最常见的正则表达式,而把其他词作为“足够好”。不要试图排除˥
符号,因为它不太可能用于普通句子中。通过使用,您可以创建数组。但是,您可以使用match
返回单词数组,而不是使用split(尝试按匹配项拆分字符串)
var wordsRegex = /([^\x00-\x7F]|\w)+/g;
var sentence = 'Hello! How are you?';
console.log(sentence.match(wordsRegex)); //=> ['Hello', 'How', 'are', 'you']
sentence = 'Perché sei partito?';
console.log(sentence.match(wordsRegex)); //=> ['Perché', 'sei', 'partito']
不过,您需要注意的一点是,正则表达式只考虑英语标点符号,因此如果字符串包含拉丁语标点符号(例如
),则会在结果中得到这些标点符号
sentence = 'Perché sei partito¡';
console.log(sentence.match(wordsRegex)); //=> ['Perché', 'sei', 'partito¡']
如果需要排除非英语标点符号,可以向正则表达式中添加任何要排除的标点符号。如果你想排除所有可能的非英语字符和英语字符,你会得到一个相当大的正则表达式,所以你可能只想考虑排除最常见的正则表达式,而把其他词作为“足够好”。不尝试排除
˥
符号,因为它不太可能在普通句子中使用。使用字符串的另一种解决方案。match
函数:
var str = "Perché sei partito?",
words = str.match(/[a-zA-Z\u00C0-\u1FFF\u2C00-\uD7FF]+\b/g);
console.log(words); // ["Perch", "sei", "partito"]
使用
String.match
函数的另一种解决方案:
var str = "Perché sei partito?",
words = str.match(/[a-zA-Z\u00C0-\u1FFF\u2C00-\uD7FF]+\b/g);
console.log(words); // ["Perch", "sei", "partito"]
那么您在ASCII字符之间进行了检查了吗?正则表达式将获取所有不在NULL到DEL(0-127)范围内的unicode字符。由于该范围还包括所有英文字符,我们需要使用
\w
将它们添加回。这太神奇了,我从来都不知道。所以您在ASCII字符之间进行了检查?正则表达式将获取所有不在NULL到DEL(0-127)范围内的unicode字符。由于该范围还包括所有英文字符,我们需要使用\w
将它们添加回。这太神奇了,我从来不知道。