将一个字符串解析为没有英文字符和puntuation的单词

时间:2016-05-12 06:49:01

标签: javascript string parsing

我正在尝试将字符串拆分为Javascript中的单个单词数组。第一步很简单:

words = text.split(/\b\s+(?!$)/);

此解决方案正常,但不使用标点符号作为分隔符。例如写下“你好!你好吗?”,在一系列单词中我找到“你好!”,“如何”,“是”,“你呢?”。

我用一个不太优雅的解决方案解决了这个问题(但它确实有效!):

str= str.replace(",","");
str= str.replace(".","");
str= str.replace("!","");
str= str.replace("?","");

但仍有一个大问题。如果str包含任何非英文字符(例如意大利字符ò,à,è,ù),则方法拆分不会拆分单词。

例如,如果文本是“Perchéseipartito?”,则“Perchései”会被拆分为数组单词的单个元素(就像它是单个单词一样)。

任何解决方案?非常感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

使用regular expression that matches all non-english and english unicode characters,您可以创建阵列。但是,您可以使用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¡']

如果您需要排除非英语标点符号,则可以向正则表达式添加要排除的任何unicode characters。公平的警告,如果你试图排除所有可能的非英语和英语字符,你最终会得到一个相当大的正则表达式,所以你可能只想考虑排除最常见的那些并留下其他人作为"够好了。"例如,不要试图排除˥符号,因为它不太可能在常用句子中使用。

答案 1 :(得分:0)

有关删除标点符号的更优雅解决方案,请参阅此处: How can I strip all punctuation from a string in JavaScript using regex?

要解决重音字符问题,请考虑使用以下正则表达式:

(?=\w|\W)\s+

虽然这个空白换行了,但是如果你在我链接的问题中使用顶级解决方案,这应该足以解决你的问题了:

(?=\w|\W)\s

答案 2 :(得分:0)

使用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"]