【问题标题】:Is there an easier way to filter non-alphabetic characters? c++有没有更简单的方法来过滤非字母字符? 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

标签: c++ qt


【解决方案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_]。所以它也会在空格上分裂。
    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 2021-08-11
    • 2020-01-29
    • 2016-06-02
    • 2011-05-21
    相关资源
    最近更新 更多