【问题标题】:How do I split a phrase into words using Regex in C#如何在 C# 中使用正则表达式将短语拆分为单词
【发布时间】:2012-05-01 15:25:50
【问题描述】:

我正在尝试使用正则表达式将句子/短语拆分为单词。

var phrase = "This isn't a test.";
var words = Regex.Split(phrase, @"\W+").ToList();

单词包含“This”、“isn”、“t”、“a”、“test”

显然,它正在使用撇号并对其进行拆分。我可以改变这种行为吗?它还需要支持多种语言(西班牙语、法语、俄语、韩语等)。

我需要将单词传递给拼写检查器。特别是 Nhunspell。

return (from word in words let correct = _engine[langId].Spell(word) where !correct select word).ToList();

【问题讨论】:

  • 尝试分割空格?您是否有很好的用例示例来演示此 Regex 需要处理的内容?
  • 我正在将单词传递给拼写检查器,所以我需要丢失标点符号。
  • 由于您想针对多种不同的语言进行拆分,因此您需要使用能够理解所述语言的分词器。在您的示例中, is not clear 是一个词,但在另一种语言中, ' 通常可能不是该词的一部分。因此,大多数拼写检查库都带有一个 Tokenizer 或 Parser 可以为您完成这项工作。

标签: c# regex


【解决方案1】:

如果您想拆分成单词进行拼写检查,这是一个很好的解决方案:

new Regex(@"[^\p{L}]*\p{Z}[^\p{L}]*")

基本上你可以使用以前的正则表达式来使用 Regex.Split。 它使用 unicode 语法,因此它可以在多种语言中工作(尽管不适用于大多数亚洲语言)。 而且它不会用撇号或连字符打断单词。

【讨论】:

    【解决方案2】:

    使用Split()

    words = phrase.Split(' ');
    

    没有标点符号。

    words = phrase.Split(new Char [] {' ', ',', '.', ':', , ';', '!', '?', '\t'});
    

    【讨论】:

      【解决方案3】:

      由于许多语言使用非常复杂的规则将单词串成短语和句子,因此您不能依靠简单的正则表达式从一段文本中获取所有单词。即使对于像英语这样“简单”的语言,您也会遇到许多极端情况,例如:

      • 如何处理像你这样的单词,不是将两个单词组合起来,将多个字符替换为'。
      • Mr. Mrs. i.e.等缩写如何处理
      • 使用'-'的组合词
      • 在句尾加连字符。

      众所周知,中文和日文(以及其他)很难以这种方式解析,因为这些语言不使用单词之间的空格,只在句子之间使用空格。

      您可能想阅读Text Segmentation,如果分段对您很重要,请购买可以解析整个文本的拼写检查器或可以根据规则将句子分成单词的文本分段引擎语言。

      我找不到一个基于 .NET 的多语言分割引擎和快速谷歌搜索。对不起。

      【讨论】:

        【解决方案4】:

        您似乎并不需要正则表达式。你可以这样做:

        phrase.Split(" ");
        

        【讨论】:

        • 仅当您想要在您的文字中使用标点符号时。
        【解决方案5】:

        你想分割什么?空间?标点?您必须决定停止字符是什么。一个使用空格和一些标点符号的简单正则表达式是"[^.?!\s]+"。这将在句号、问号、感叹号和任何空白字符上分开。

        【讨论】:

        • 我还需要考虑西班牙语,其中会有颠倒的感叹词和问题。
        • 然后将这些字符添加到[] 内和^ 之后的字符列表中。所以,例如"[^.?!¿¡\s]"。您可能需要添加括号、逗号、分号和许多其他标点符号。该列表是您不想在您的文字中出现的字符。开头的^ 表示“不是这些字符”。因此,您还需要将插入符号 (^) 字符添加到列表中。
        • 好的,我要看看我能做些什么来获取标点符号列表。我喜欢这种方法。
        【解决方案6】:

        如果您只是尝试基于空格进行拆分,您可以尝试。

        var words = Regex.Split(phrase, @"[^ ]+").ToList();
        

        另一种方法是通过将撇号添加到您的字符类来添加撇号。

        var words = Regex.Split(phrase, @"(\W|')+").ToList();
        

        否则,是否有特定原因不能使用 string.Split()?这看起来要简单得多。此外,您还可以传入其他标点符号(例如,分隔 . 和空格)。

        var words = phrase.Split(' ');
        var words = phrase.Split(new char[] {' ', '.'});
        

        【讨论】:

          【解决方案7】:

          我不是 java 人,但您可以尝试在拆分时排除标点符号
          同时空间。可能是这样的。

          这些是原始和扩展的正则表达式,单词在捕获组 1 中。
          进行全局搜索。

          Unicode(不考虑字形)

          [\s\pP]* ([\pL\pN_-] (?: [\pL\pN_-] | \pP(?=[\pL\pN\pP_-]) )* )
          

          ASCII

          [\s[:punct:]]* (\w (?: \w | [[:punct:]](?=[\w[:punct:]]) )* )
          

          【讨论】:

            【解决方案8】:

            这对我有用:[^(\d|\s|\W)]*

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2011-05-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-09-24
              相关资源
              最近更新 更多