1

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

我需要在字符串中找到任何像#text.

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

例子:

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

我使用 QRegExp。

4

4 回答 4

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

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

于 2012-06-21T06:45:59.813 回答
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 类参考,了解每个转义组的说明。

然后在更大的文本字符串中匹配(同样,未经测试):

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

一个有用的工具是SDK 附带的正则表达式示例。

于 2012-06-21T07:27:52.020 回答
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

希望能帮助到你。

于 2012-06-21T09:15:54.673 回答
-1

使用这个正则表达式。完全希望您的问题将通过给定的 RE 解决。

^([#(a-zA-Z)]+[(a-zA-Z0-9)]+)*(#[0-9]+[(a-zA-Z)]+[(a-zA-Z0-9)]*)*$
于 2012-06-21T05:20:22.437 回答