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]*0 個以上のラテン数字
    • [A-Za-z]単一の大文字または小文字のラテン文字
  • )
  • [A-Za-z0-9]{2,}次に、大文字または小文字のラテン文字またはラテン数字の少なくとも 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;
    }

テストを作成するために、次のような入力を与えます (長い文字列を 1 つのコマンド ライン引数にします)。

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

そして、 #hjhj#33eの 2 つの単語のみに一致します。

それが役に立てば幸い。

于 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 に答える