Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 限制使用正则表达式发送电子邮件的最小和最大长度,但出现错误_C_Regex_Posix - Fatal编程技术网

C 限制使用正则表达式发送电子邮件的最小和最大长度,但出现错误

C 限制使用正则表达式发送电子邮件的最小和最大长度,但出现错误,c,regex,posix,C,Regex,Posix,以下正则表达式是否有任何错误: ^(?=.{1,32}$)\w+([-+.]\w+*@\w+([-+.]\w+*.*\w+)*\w+([-+.]\w+*$ 我使用此正则表达式模式检查电子邮件格式和长度,但执行时会显示以下错误消息: 重复运算符的使用无效,例如使用“*”作为第一个字符 我试图在我的正则表达式前面使用\来转义?,regcomp()可以编译成功,但结果是错误的 这是我的检查字符串: 测试。test@test.com-->失败,结果错误 测试:test@test.com-->失败,结果正

以下正则表达式是否有任何错误:

^(?=.{1,32}$)\w+([-+.]\w+*@\w+([-+.]\w+*.*\w+)*\w+([-+.]\w+*$

我使用此正则表达式模式检查电子邮件格式和长度,但执行时会显示以下错误消息:

重复运算符的使用无效,例如使用“*”作为第一个字符

我试图在我的正则表达式前面使用
\
来转义
regcomp()
可以编译成功,但结果是错误的

这是我的检查字符串:

测试。test@test.com-->失败,结果错误

测试:test@test.com-->失败,结果正确

环境 操作系统:

Linux debian8 3.16.0-4-686-pae#1 SMP Debian 3.16.7-ckt11-1+deb8u5(2015-10-09)i686 GNU/Linux

海湾合作委员会

使用内置规格。收集\u GCC=GCC COLLECT_LTO_WRAPPER=/usr/lib/gcc/i586 linux gnu/4.9/LTO-WRAPPER 目标:i586 linux gnu配置为:../src/configure-v --使用pkgversion='Debian 4.9.2-10'--使用bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs ——启用语言= C、C++、java、GO、D、FORTRAN、Objc,obj-c++--prefix=/usr--program suffix=-4.9--enable shared--enable linker build id--libexecdir=/usr/lib--include gettext--enable threads=posix--with gxx include dir=/usr/c++/4.9--libdir=/usr/lib--enable nls--with sysroot=--enable clocale=gnu--enable libstdcxx debug--enable libstdcxx time=yes enable gnu unique object--禁用vtable verify--enable plugin--system zlib--enable browser plugin--enable java awt=gtk--enable gtk cairo--with java home=/usr/lib/jvm/java-1.5.0-gcj-4.9-i386--jvm jar dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-i386--with arch目录=i386----使用ecj jar=/usr/share/java/eclipse-ecj.jar--enable objc gc--enable targets=all--enable multiarch--with-arch-32=i586--with-multilib list=m32、m64、mx32--enable multilib--with-tune=generic--enable checking=release--build=i586 linux gnu--target i586 linux gnu线程模型:posix gcc版本4.9.2(Debian 4.9.2-10)


根据您的标记和使用
regcomp
的提示,我假设您正在使用标准Posix库
regcomp
regexec
函数进行正则表达式匹配

regcomp
所使用的正则表达式语法在中(或中)有完整的文档记录,我发现这一点更具可读性。在其他语言中有许多regex库实现了更多的regex语法,但是您没有使用这些其他语言。因此,如果您使用的语法不在这些文档中,它将无法工作。这包括:

  • (?=.{1,32}$)
    这样的前瞻性断言。事实上,没有lookaround断言,也没有任何其他以
    (?
    开头的语法
  • 使用
    \w
    表示字母数字字符。如果使用扩展正则表达式(通过提供
    REG\u Extended
    作为
    regcomp
    的第三个参数,您应该始终这样做),那么,
    \
    唯一要做的就是防止以下正则表达式运算符字符具有特殊意义。然而,Gnu实现确实提供了一些扩展。它处理反向引用,即使Posix仅在基本正则表达式中定义它们。有些版本确实处理
    \w
    和朋友,但是这可能不适用于其他Posix正则表达式实现,例如Mac OS X
您可以使用Posix字符类来获得
\w
\w
\s
等的效果。例如,单词字符(
\w
)可以写为字符类
[\uU[:alnum:]
,而非空格字符(
\s
)可以写为
[^[:space:]
。使用此语法是完全可移植的

前瞻断言没有解决方法,除了创建一个单独的正则表达式并从正确的点开始匹配它。但是如果您只想检查字符串的长度,则不需要任何复杂的内容。只需检查字符串的长度:

size_t len = strnlen(str, maxlen + 1);
if (len >= minlen && len <= maxlen &&
    regexec(&preg, str, 0, 0, 0)) {
  /* The string matched, and its length is between minlen and maxlen */
} else {
  /* Not a match, or too short or too long */
}
它坚持认为
-
+
如果存在,必须在前面和后面加上单词字符(因此它们不能在开头或结尾,并且不能有两个字符在一行)。

这是您的正则表达式:

^(?=.{1,32}$)\w+([-+.]\w+)*@\w+([-+.]\w+)*.\w+([-+.]\w+)*$
你在逃避它,因为:

^(\?=.{1,32}$)\w+([-+.]\w+)*@\w+([-+.]\w+)*.\w+([-+.]\w+)*$
但是,您[可能]将其放入一个字符串中:

"^(\?=.{1,32}$)\w+([-+.]\w+)*@\w+([-+.]\w+)*.\w+([-+.]\w+)*$"
因此,必须对反斜杠进行双转义:

"^(\\?=.{1,32}$)\w+([-+.]\w+)*@\w+([-+.]\w+)*.\w+([-+.]\w+)*$"
同样,使用所有反斜杠:

"^(\\?=.{1,32}$)\\w+([-+.]\\w+)*@\\w+([-+.]\\w+)*.\\w+([-+.]\\w+)*$"
但是,您可能不想逃避
,因此我们有:

"^(?=.{1,32}$)\\w+([-+.]\\w+)*@\\w+([-+.]\\w+)*.\\w+([-+.]\\w+)*$"
这是必要的,因为在一个字符串中,C字符串解析器可能会弄脏它们。在剥离之后,您希望
regcomp
[或等效的]得到
\w
,而不仅仅是
w


并非所有正则表达式包/库都支持
(?=
,因此如果您需要,请确保您的正则表达式是.IIRC,
pcre
的。我觉得您的正则表达式非常好。您也可以使用联机工具进行检查。可能您的错误存在于代码或特定于代码的字符串语法中。请参阅示例。您的正则表达式引擎可能不支持正loOkaward-类似(?=a)的构造。要验证此假设,请尝试编译构造“(?=a)a”。如果它已编译,请尝试将字符串“a”与其匹配。它应该匹配。如果所有这些工作-则可能是由于正则表达式的长度可变(正向),请尝试编译(?=a+)@Dmitry您的假设是正确的。我认为regexp引擎不受支持。有没有办法在没有正向前瞻的情况下动态设置电子邮件地址的最小和最大长度?“有没有办法在没有正向前瞻的情况下动态设置电子邮件地址的最小和最大长度?”只是che
"^(?=.{1,32}$)\\w+([-+.]\\w+)*@\\w+([-+.]\\w+)*.\\w+([-+.]\\w+)*$"