【问题标题】:Parsing a string into words with no-english characters and puntuation将字符串解析为具有非英语字符和标点符号的单词
【发布时间】:2016-05-12 06:49:01
【问题描述】:

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

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

此解决方案工作正常,只是它不使用标点符号作为分隔符。例如写“你好!你好吗?”,在单词数组中我找到“你好!”、“怎么样”、“是”、“你?”。

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

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

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

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

有什么解决办法吗?非常感谢您的帮助!

【问题讨论】:

    标签: javascript string parsing


    【解决方案1】:

    通过使用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。公平的警告,但如果您尝试排除所有可能的非英语和英语字符,您最终会得到一个相当大的正则表达式,因此您可能只想考虑排除最常见的那些,而让其他的“足够好”。例如,不要试图排除 ˥ 符号,因为它不太可能在普通句子中使用。

    【讨论】:

    • 所以你检查了 ASCII 字符之间的关系?
    • 正则表达式抓取不在 NULL 到 DEL (0 - 127) 范围内的所有 unicode 字符。由于该范围还包括所有英文字符,我们需要使用 \w 将它们添加回来。
    • 太棒了,我从来不知道。
    【解决方案2】:

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

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

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

    虽然这个选择了空换行符,但是如果您在我链接的问题中使用最佳解决方案,这应该足以解决您的问题:

    (?=\w|\W)\s
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-26
        • 2017-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多