我的正则表达式真的很糟糕,所以请帮助我。
我需要在字符串中找到#text
之类的任何内容。
text
不得包含任何空格字符(\\s
)。它的长度必须至少为2个字符({2,}
),且必须至少包含1个字母(QChar::isLetter()
)。
示例:
#c
,#1
,#123456
,#123 456
,#123_456
不正确#cc
,#text
,#text123
,#123text
是正确的我使用QRegExp。
答案 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)]*)*$