正则表达式用于测试字符串的字符长度

3

如何使用正则表达式测试字符串的长度?

比如说,如何匹配只含有一个字符的字符串?


7
语言是什么?为什么你不能使用像 length()strlen() 这样的适当函数? - CanSpice
/^.$/,但我不敢相信你使用的任何语言都没有更好的方法来完成这个任务。 - lonesomeday
4个回答

3
锚定字符串的开头和结尾,并匹配一个字符。在许多语言中:
^.{1}$

在Ruby的正则表达式中:
\A.{1}\z

{1} 没有添加任何内容。后者是正确的,而前者将匹配 "x" 和 "x\n"。您还需要确保 "." 可以匹配 "\n",否则它通常不会匹配(在 Ruby 中为 /m 修饰符)。 - Seth Robertson
2
@Seth 在 OP 提到的“例如”情况下,{1} 没有添加任何内容,但是 OP 要求一般情况下如何测试长度。我已经添加了 {1}(其他人也这样做)以明确如何匹配不同数量的字符。此外,$ 是否在“\n”之后匹配取决于正则表达式的风格。由于 OP 尚未指定风格,因此您的陈述并不完全正确。 - Phrogz

3
^.$

但是大多数框架都包含返回字符串长度的方法,你应该使用这些方法来代替正则表达式。


{1}是多余的,只会增加干扰。 - CanSpice
$ 也可以匹配换行符,因此 re 可以匹配 "x" 和 "x\n"。 - Seth Robertson
@Seth 在哪种正则表达式中,$会匹配换行符后面的内容?OP没有提到具体应用场景。例如,在JavaScript中,/foo$/.test("foo\n")返回false。 - Phrogz
@Phrogz:不,重点是它在换行符和行尾之前匹配。至于正则表达式的类型,我知道的有System V、POSIX、Perl、Ruby、PHP、Python。实际上,我并不知道有任何一种不是这样工作的。嗯,直到我看到你的JavaScript示例之前,我还不知道有这样的情况。 - Seth Robertson

1

匹配单个字符可以使用 Perl 正则表达式:

/\A.\z/s

\A 表示“字符串的开头”,. 表示“任何字符”,\z 表示“字符串的结尾”。如果没有 \A\z,则匹配的字符串将是长度大于一个字符的任意字符串。

编辑:但实际上你应该做一些像这样的事情:

if( length($string) == 1 ) {
  ...
}

(以Perl为例)
编辑2:之前我使用了“/^.$/”,但正如Seth所指出的那样,这允许匹配长度为两个字符且最后一个字符为“\n”的字符串。而“\A...\z”结构可以解决这个问题。

列出的正则表达式将匹配 "x" 和 "x\n"。 - Seth Robertson
除了 . 通常意味着“任何字符但不包括 \n”,除非您使用 /s 修改器(在 Ruby 中为 /m),因此 "\n" 将不匹配。 - Seth Robertson

0
/^.\z/s

上述需要Perl兼容的正则表达式。诀窍在于/^.$/可能匹配"x"和"x\n"。添加/s修饰符对此没有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接