使用RegExp检测“#smth”之类的文本(带有更多术语)

时间:2012-06-21 04:58:24

标签: c++ regex qt qregexp

我的正则表达式真的很糟糕,所以请帮助我。

我需要在字符串中找到#text之类的任何内容。

text不得包含任何空格字符(\\s)。它的长度必须至少为2个字符({2,}),且必须至少包含1个字母(QChar::isLetter())。

示例:

  • #c#1#123456#123 456#123_456不正确
  • #cc#text#text123#123text是正确的

我使用QRegExp。

4 个答案:

答案 0 :(得分:2)

QRegExp rx("#(\\S+[A-Za-z]\\S*|\\S*[A-Za-z]\\S+)$");
bool result = (rx.indexIn(str) == 0);

rx要么找到一个非空格后跟一个字母和一个未指定数量的非空白字符,要么找到一个后跟至少非空格的字母。

答案 1 :(得分:1)

我能提出的最短时间(工作,但我没有进行过广泛测试)是:

QRegExp("^#(?=[0-9]*[A-Za-z])[A-Za-z0-9]{2,}$");

匹配:

  • ^字符串的开头
  • #文字哈希字符
  • (?=然后向前看(但不匹配)
    • [0-9]*零个或多个拉丁数
    • [A-Za-z]单个大写或小写拉丁字母
  • )
  • [A-Za-z0-9]{2,}然后匹配至少两个可能是大写或小写拉丁字母或拉丁数的字符
  • $然后查找并使用该行的结尾

从技术上讲,这仍然是错误的。它只匹配拉丁字母和数字。更换几位会给你:

QRegExp("^#(?=\\d*[^\\d\\s])\\w{2,}$");

这适用于非拉丁字母和数字,但这完全未经测试。快速阅读QRegExp class reference,了解每个转义组的解释。

然后匹配更大的文本字符串(再次,未经测试):

QRegExp("\b#(?=\\d*[^\\d\\s])\\w{2,}\b");

一个有用的工具是SDK附带的Regular Expressions Example

答案 2 :(得分:1)

Styne666给出了正确的正则表达式。

这是一个小的Perl脚本,试图将其第一个参数与此正则表达式匹配:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    my $arg = shift;
    if ($arg =~ m/(#(?=\d*[a-zA-Z])[a-zA-Z\d]{2,})/) {
        print "$1 MATCHES THE PATTERN!\n";
    } else {
        print "NO MATCH\n";
    }

Perl总是非常适合快速测试正则表达式。

现在,你的问题有点不同了。您想要查找文本字符串中的所有子字符串, 你想在C ++ / Qt中做到这一点。以下是几分钟后我能想到的内容:

    #include <QtCore/QCoreApplication>
    #include <QRegExp>
    #include <iostream>

    using namespace std;

    int main(int argc, char *argv[])
    {
        QString str = argv[1];
        QRegExp rx("[\\s]?(\\#(?=\\d*[a-zA-Z])[a-zA-Z\\d]{2,})\\b");

        int pos = 0;
        while ((pos = rx.indexIn(str, pos)) != -1)
        {
            QString token = rx.cap(1);
            cout << token.toStdString().c_str() << endl;
            pos += rx.matchedLength();
        }

        return 0;
    }

为了进行测试我给它输入了这样的输入(使一个长字符串只是一个命令行参数):

    peter@ubuntu01$ qt-regexp "#hjhj  4324   fdsafdsa  #33e #22"

它只匹配两个词: #hjhj #33e

希望它有所帮助。

答案 3 :(得分:-1)

使用此正则表达式。希望你的问题能够通过给定的RE来解决。

^([#(a-zA-Z)]+[(a-zA-Z0-9)]+)*(#[0-9]+[(a-zA-Z)]+[(a-zA-Z0-9)]*)*$