【问题标题】:How to filter text file content using QRegExp?如何使用 QRegExp 过滤文本文件内容?
【发布时间】:2016-06-09 10:51:34
【问题描述】:

我有一个包含以下行的文本文件:

a1     b00     2222 
a1     b01     233 
a1     b92     34444
a2     b00      2222
a2     b00      3333
a2     b01      3333

我想阅读这个文件并使用QRegExp过滤文本

并将结果填入三个QComboBox combo1,第一个匹配情况,combo2第二个匹配情况,combo3第三个匹配情况。 结果如下:

 combo1 
 a1 
 a2

当从combo1 中选择 a2 时,combo2 将是

 combo2 
  b00   
  b01

当从combo2 中选择 b00 时,combo3 将是

 combo3 
 2222 
 3333

我没有与QRegExp 合作过,有人可以告诉我如何做到这一点吗?

【问题讨论】:

    标签: c++ qt text-files qcombobox qregexp


    【解决方案1】:

    我建议您不要使用QRegExp 来过滤此内容。因为您正在使用以空格分隔的文件,所以非常只需将其读入vector 并使用它来填充QComboBoxes。例如:

    ifstream foo("foo.txt");
    vector<string> combos{istream_iterator<string>(foo), istream_iterator<string>()};
    
    for(auto i = 0; i < size(combos); ++i) {
        switch(i % 3) {
        case 0:
            combo1.addItem(combos[i]);
            break;
        case 1:
            combo2.addItem(combos[i]);
            break;
        case 2:
            combo3.addItem(stoi(combos[i]));
        }
    }
    

    Live Example

    请注意,您也可以使用QTextStream 并将这些内容直接读入QString 甚至QStringList。我选择不这样做是为了将您的业务逻辑与您的 GUI 逻辑分开。

    【讨论】:

    • 这里的size 是什么? (编辑)我认为并非所有编译器都支持std::size
    • @Jonathan Mee 我可以读取文本文件并填充字符串的 inot 向量,但我只想测试 QRegExp 在此示例中的工作方式,我想在这种情况下使用匹配和上限。
    • @Ajay 你说得对,size 是 C++17。如果您没有 C++17,则需要使用 combos.size()。但是,如果您确实拥有 C++17,我会很好地说明为什么 size(combos) 现在比 combos.size() 更受欢迎:stackoverflow.com/questions/33442629/…
    • 是的,我明白了。感谢您分享新内容!
    • @WaleedA 鉴于我可用的示例,我已经为您提供了解决此问题的正确方法。如果您使用正则表达式:"Now you have two problems." 我不是这么说的,因为我反对正则表达式。事实上,如果你能提供一个更适合正则表达式的例子,那么我很乐意更新我的答案。
    【解决方案2】:

    我需要过滤(匹配)每一行的QregExp是这个

        QRegExp rx("\\s*(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s*"); 
        if (rx.exactMatch(line) //to cehck if rx matches the line from the text file
          {
              QString col1 = rx.cap(1);//the first column that goes to combo1
              QString col2 = rxHeader.cap(2);//the second column that goes to combo2
              QString col2 = rxHeader.cap(3);//the third column that goes to combo3
          }
    

    现在它适用于我。

    【讨论】:

    • 如果您添加了实际处理文件的代码,这将起作用。但至少对于提供的示例,并且可能对于任何以空格分隔的文件,这是一个较差的解决方案。我鼓励您考虑将my solution 作为更好的选择。
    • 在 Qt5 中,你会想使用 QRegularExpression 它有一个很好的关于它的使用的文章:doc.qt.io/qt-5/qregularexpression.html#details 你会发现关于如何完成任务的问题会得到答案stackoverflow.com 上的正确工具,但是,如果您阅读 Qt 的文章并对某个特定点有疑问并发布这些问题,我相信您会收到非常出色的答案。如果您发现自己处于这种情况,请随时链接新问题,我也会尝试回答。
    猜你喜欢
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 2019-09-24
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多