有没有更简单的方法来过滤非字母字符? 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++的主要内容,如果未能解决你的问题,请参考以下文章
在javascript 中,如何正确的使用,正则表达式, 过滤特殊字符(非字母表中的字符[a-zA-Z0-9])
求php过滤ios的Emoji表情的方法,如果字符串中包含Emoji表情就删除。