有没有更简单的方法来过滤非字母字符? C++

Posted

技术标签:

【中文标题】有没有更简单的方法来过滤非字母字符? C++【英文标题】:Is there an easier way to filter non-alphabetic characters? c++ 【发布时间】:2017-04-29 09:46:15 【问题描述】:

有没有更简单的方法来简单地删除或过滤掉 C++ 中的所有个非字母字符?

我正在加载文件以将每个单词分类到字典中,并且我希望字典仅包含单个完整单词,没有空格和非字母字符。

//Read the entire file (stream) into QString variable "file"
            QString file = in.readAll();
            QStringList NewList = file.split(QRegExp("[\\s\\,\\!\\?\\...\\;\\:\\-\\[\\]\\\\\\+\\-\\=\\_\\<\\>\\]QString::SkipEmptyParts);

这种方法确实有效,但是简单地列出所有非字母字符非常低效。

有人可以告诉我一个更快的方法吗?

我确定这不是最好的方法...

【问题讨论】:

看isalpha 像您这样的问题已经得到解答。 here 像你这样的问题已经得到解答here 【参考方案1】:

使用正则表达式是正确的方法,但使用它来查找单词而不是在哪里拆分。然后你的代码变得更有表现力,更不容易出错。此外,使用 Qt5 的新 QRegularExpression 类,因为它的性能更好。

至于正则表达式:查阅任何教程并阅读\w\b 的含义。作为一个例子(\b 不需要,但出于演示目的,我把它放在那里......):

QString data = "Lorem ipsum dolor sit amet, consetetur - sadipscing - elitr. Stet clita kasd gubergren!";

QRegularExpression rx("\\b(\\w+)\\b");
QRegularExpressionMatchIterator matches = rx.globalMatch(data);
while (matches.hasNext()) 
    QRegularExpressionMatch match = matches.next();
    qDebug() << match.captured(1);

【讨论】:

【参考方案2】:

对于您的具体情况,我会首先确定文件是否具有预先确定的格式,而不是基于正则表达式提取字符,这可能会更加低效。 例如。定界、每行字数等。

但是,您的 RegEpx 的更简单形式可能是:

QStringList NewList = file.split(QRegExp("\\W", QString::SkipEmptyParts);   

虽然这不包括撇号和重音之类的东西。

【讨论】:

\W(大写 W)是 [\^w] 的缩写,它是所有“非单词”字符 [A-Za-z0-9_]。所以它也会在空格上分裂。

以上是关于有没有更简单的方法来过滤非字母字符? C++的主要内容,如果未能解决你的问题,请参考以下文章

通过应用过滤器摆脱 nil 后将类型更改为非可选

在javascript 中,如何正确的使用,正则表达式, 过滤特殊字符(非字母表中的字符[a-zA-Z0-9])

求php过滤ios的Emoji表情的方法,如果字符串中包含Emoji表情就删除。

使用Javascript过滤搜索,重音等于common的字符

使用发布者过滤字符串字段中的数字

asp 查找过滤中文字符串