当前位置: 首页 > 知识库问答 >
问题:

限制带有regex的电子邮件的最小和最大长度,但错误

郦昆
2023-03-14

下面的regex是否有错误:

我尝试在regex前面使用\来转义regcomp()可以编译成功,但结果是错误的。

下面是我的检查字符串

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

使用内置规格。collect_gcc=gcc collect_lto_wrapper=/usr/lib/gcc/i586-linux-gnu/4.9/lto-wrapper目标:i586-linux-gnu配置有:../src/configure-v--with-pkgversion='debian 4.9.2-10'--with-bugurl=file:///usr/share/doc/gcc-4.9/readme.bugs--enable-languages=C,C++,java,go,d,fortran,OBJ-C++--prefix=/usr--program-suffix=-4.9--enable-shared--enable-linker-build-id--libexecdir=/usr/lib libdir=/usr/lib--enable-nls--with-sysroot=/--enable-clocale=gnu--enable-libstdcxx-debug--enable-libstdcxx-time=yes--enable-gnu-unique-object-disable-vtable-verify--enable-plugin-with-system-zlib--disable-browser-plugin--enable-java-awt=gtk-enable-gtk-cairo--with-jvm=/usr/lib/jvm/java-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-i386-with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-i386-with-arch-directory=i386-with-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--host=i586-linux-gnu--target=i586-linux-gnu线程模型:posix gcc version 4.9.2(Debian 4.9.2-10)

共有1个答案

陶法
2023-03-14

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

regcomp使用的正则表达式语法在Man 7 regex中有完整的文档(或者在Posix本身中,我发现Posix本身的可读性更强)。其他语言中有许多regex库,它们实现了更多种类的regex语法,但您没有使用这些其他语言。因此,如果您使用的语法不在这些文档中,它将无法工作。这包括:

  • 向前查找断言,如(?=.{1,32}$)。事实上,在(?.
  • )开始时,没有查找断言,也没有任何其他语法
  • 使用\w表示字母数字字符。如果您使用扩展正则表达式(通过提供reg_extended作为regcomp的第三个参数--您应该始终这样做),那么\所做的唯一事情就是防止下面的正则表达式运算符字符具有特殊含义。但是,Gnu实现确实提供了一些扩展。它处理反向引用,即使Posix只在基本正则表达式中定义它们。有些版本确实处理\w和friends,但这可能不适用于其他Posix regex实现,如Mac OS X.

可以使用Posix字符类获得\w\w\s等的效果。例如,单词字符(\w)可以写成字符类[_[:alnum:]],而非空格字符(\s)可以写成[^[:space:]]。使用这种语法是完全可移植的。

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

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 */
}

(我使用了strnlen,它在Posix 2008中;它是在glibc中实现的。这样做的好处是,如果只需要知道字符串不太长,strnlen就可以避免查看太多字符。也就是说,如果我要拒绝一个超过32个字符的字符串,并且我要查看的字符串是一个兆字节,那么计算strlen(str)是愚蠢的,它需要查看字符串中的每个字符。strnlen(str,33)将只查看前33个字符,如果结果是33,我就知道字符串太长了。)

如果我正确地理解您试图检查的内容,您可以使用下面稍微简单一点的正则表达式:

[_[:alnum:]]([-+.]?[_[:alnum:]])*@[_[:alnum:]]([-+.]?[_[:alnum:]])*

它坚持-+.(如果存在的话)必须在前面和后面加上单词字符(因此它们不能在开头或结尾,也不能在一行中有两个字符。)

 类似资料:
  • 问题内容: 我试图从表中获取所有列的列表,这些列表包含它们的数据类型,数据长度和该列中最长值的长度。 我使用此SQL来获取列及其数据类型和长度: 我有此SQL,用于获取值的最大长度: 但是我不知道如何将它们结合起来。我正在使用SQL Server 2008。 问题答案: 感谢您的建议。我想出了以下解决方案。它为我获取了我需要的数据,但是希望了解它是否可以提高效率。

  • 问题内容: 我想返回该数字,只要它在限制范围内,否则返回限制的最大值或最小值。我可以结合使用和和。 我想知道,如果有一个现有的或我俯瞰功能。 如果第三方库很常见(例如Commons或Guava),则欢迎它们 问题答案: 从版本21开始,Guava包括(以及其他原语的等效方法)。从发行说明中: 添加了将给定值限制在和值定义的封闭范围内的方法。如果值在范围内,则返回值本身,如果值在范围内,则返回值,如

  • 问题内容: 如何限制草稿js中的最大字符数? 我可以得到类似状态的长度,但是如何停止更新组件呢? 问题答案: 您应该定义和支持。在处理程序函数中,您检查当前内容的长度+粘贴文本的长度,如果达到最大值,则应返回字符串。 UPD 21.03.2018:升级到最新版本的react / react-dom(16.2.0)和Draft.js(0.10.5)。 工作示例-https://jsfiddle.ne

  • 问题内容: 我在MySQL查询中使用,将多行转换为单个字符串。但是,此函数结果的最大长度为字符。 我非常清楚,我可以更改参数以增加此限制: 但是,在我使用的服务器上,我无法更改任何参数。不能通过使用前面的查询,也不能通过编辑任何配置文件。 所以我的问题是:还有其他方法可以将多行查询的输出转换为单个字符串吗? 问题答案: 这个查询有点奇怪,但是不需要另一个查询来初始化变量。并且可以将其嵌入更复杂的查

  • 问题内容: 我正在使用JVM标志运行Java进程,并看到以下输出: 有没有办法解决这个问题? 问题答案: 当无法满足Java堆的分配或永久生成时,命令行选项告诉HotSpot VM生成堆转储。使用此选项运行不会产生任何开销,因此对于OutOfMemoryError需要很长时间才能浮出水面的生产系统很有用。 为了解决您面临的特定问题,可以使用以下纠正措施之一: 措施1: XX:HeapDumpSeg

  • 问题内容: 我想限制a的最大大小,以对正在实现的各种哈希算法进行度量。我在的一个重载构造函数中查看了loadfactor 。 我尝试在构造函数中将loadFactor设置为0.0f(这意味着我不希望HashMap的大小从EVER增大),但将此无效: 还有另一种方法来限制它的大小,使其永远不会增长吗? 问题答案: 有时越简单越好。