[英]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
不确定我是否理解您在说什么, 但这可能会对您有所帮助
QString sentence("Aujourd'hui séparer l'élément en deux");
QStringList list = sentence.split(" '");
好吧,您在这里处理的是一种自然语言,而要回答的第一个(也是最困难的)问题是:您真的能想出一个固定的规则,什么时候应该发生分裂吗? 在这种特殊情况下,确实没有逻辑上的理由,为什么法语将“aujourd'hui”视为一个单词(从逻辑上讲,它可以被解析为“au jour de hui”)。
我不熟悉法语中所有可能的陷阱,但是如果您真的想确保涵盖所有晦涩的情况,则必须寻找自然语言标记器。
无论如何,对于您给出的示例,当撇号前面有多个字母时,使用带有负后瞻的QRegularExpression
来省略拆分可能就足够了:
sentence.split(QRegularExpression("(?<![\\w][\\w])'"));
由于您要视为单独单词的缩写通常是单个字母 + 法语中的撇号(如l'huile
、 n'en
、 d'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.