繁体   English   中英

将句子拆分为包含撇号的单词

[英]Split sentence to words containing apostrophe

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

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(" ");

Output:

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

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

不确定我是否理解您在说什么, 但这可能会对您有所帮助

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

我不知道 C++ 但我猜它支持负面的后视。

试一试:

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

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

演示和解释

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

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

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

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

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

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

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

请参阅正则表达式演示

细节

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

在 Qt 中,您可以使用

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

R"(...)"是原始字符串文字符号,如果您正在使用,您可以使用"\\s+|(?<=\\b\\p{L}[''])\\b"不允许原始字符串文字的 C++ 环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM