我在正则表达式方面真的很糟糕,所以请帮助我。
我需要在字符串中找到任何像#text
.
text
不得包含任何空格字符 ( \\s
)。它的长度必须至少为 2 个字符 ( {2,}
),并且必须包含至少 1 个字母 ( QChar::isLetter()
)。
例子:
#c
,#1
,#123456
,#123 456
,#123_456
不正确#cc
,#text
,#text123
,#123text
是正确的
我使用 QRegExp。
QRegExp rx("#(\\S+[A-Za-z]\\S*|\\S*[A-Za-z]\\S+)$");
bool result = (rx.indexIn(str) == 0);
rx 要么找到一个非空白后跟一个字母和未指定数量的非空白字符,要么找到一个字母后跟至少一个非空白。
我能想到的最短的(应该可以工作,但我没有进行广泛的测试)是:
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 附带的正则表达式示例。
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。
希望能帮助到你。
使用这个正则表达式。完全希望您的问题将通过给定的 RE 解决。
^([#(a-zA-Z)]+[(a-zA-Z0-9)]+)*(#[0-9]+[(a-zA-Z)]+[(a-zA-Z0-9)]*)*$