【问题标题】:Split sentence to words containing apostrophe将句子拆分为包含撇号的单词
【发布时间】:2020-04-18 12:47:01
【问题描述】:

假设我有一组单词作为这样的句子:

Aujourd'hui séparer l'élément en deux

并希望结果是单个单词(拆分后):

Aujourd'hui |分离器 |我' |元素 | zh |双人

注意:如您所见,«aujourd'hui » 是一个单词。

在这里使用的最佳正则表达式是什么?


以我目前的知识,我能做到的就是这个基本操作:

QString sentence("Aujourd'hui séparer l'élément en deux");
QStringList list = sentence.split(" ");

输出:

Aujourd'hui / Séparer / l'élément / en / deux

这是最接近我的两个问题:thisthis

【问题讨论】:

    标签: c++ regex qt


    【解决方案1】:

    由于您希望将其视为单独单词的缩写通常是单个字母 + 法语中的撇号(如 l'huilen'end'accord),您可以使用匹配 1+ 个空格字符的模式, 或紧接在单词开头,然后是 1 个字母,然后是撇号的位置。

    我还建议考虑使用大撇号。所以,使用

     \s+|(?<=\b\p{L}['’])\b
    

    请参阅regex demo

    详情

    • \s+ - 1+ 个空格
    • | - 或
    • (?&lt;=\b\p{L}['’])\b - 单词边界 (\b) 位置,前面有单词开头 (\b)、字母 (\p{L}) 和 '

    在 Qt 中,你可以使用

    QStringList result = text.split(
         QRegularExpression(R"(\s+|(?<=\b\p{L}['’])\b)", 
            QRegularExpression::PatternOption::UseUnicodePropertiesOption)
    );
    

    R"(...)" 是原始字符串文字表示法,如果您使用的是不允许原始字符串文字的 C++ 环境,则可以使用 "\\s+|(?&lt;=\\b\\p{L}['’])\\b"

    【讨论】:

      【解决方案2】:

      不确定我是否明白你在说什么,但this 可能会对你有所帮助

      QString sentence("Aujourd'hui séparer l'élément en deux");
      QStringList list = sentence.split(" '");
      

      【讨论】:

        【解决方案3】:

        我不懂 C++,但我猜它支持负向回溯。

        试一试:

        (?: |(?<!\w{2})')
        

        如果之前没有 2 个字母,这将在空格或撇号上拆分。

        Demo & explanation

        【讨论】:

          【解决方案4】:

          嗯,你在这里处理的是一种自然语言,第一个也是最难回答的问题是:你真的能想出一个固定的规则,什么时候应该发生分裂吗?在这种特殊情况下,法语将“aujourd'hui”视为一个单词确实没有合乎逻辑的理由(从逻辑上讲,它可以被解析为“au jour de hui”)。

          我不熟悉法语中所有可能的陷阱,但如果您真的想确保涵盖所有晦涩的情况,则必须寻找自然语言标记器。

          无论如何,对于您给出的示例,当撇号前面有多个字母时,使用带有否定后视的QRegularExpression 来省略拆分可能就足够了:

          sentence.split(QRegularExpression("(?<![\\w][\\w])'"));
          

          【讨论】:

            猜你喜欢
            • 2020-06-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-04-14
            • 2022-11-04
            • 2019-10-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多