0

当我运行下面的程序时,它没有给我任何结果(“”)。
情景1:-

$var = "A STITCH IN TIME SAVES NINE";
       if ($var =~ /[1..9]/i) {
         print "FOUND\n"
      }

但是当我在'..'运算符之前和之后添加空格时,它会抛出“Found and is”作为结果。

场景:- 2

 $var = "A STITCH IN TIME SAVES NINE";
           if ($var =~ /[1 .. 9]/i) {
             print "FOUND\n"
          }

谁能解释一下这里发生了什么?

4

3 回答 3

5

当我运行下面的程序时,它没有给我任何结果(“”)。

该字符串不包含 1、句号或 9。该模式与字符串中的任何内容都不匹配。

但是当我在 '..' 运算符之前和之后添加空格时,它会抛出“ Found and is ”

它确实包含多个空格。当您扩展字符类以匹配以包含空格时,它会匹配。

我还在声明中包含“$i”,但它仍然没有显示任何价值。

你从不定义$i. 您只尝试从中读取。

于 2013-04-11T08:43:26.517 回答
4

“..”并不表示您的字符类中的范围,它表示一个句号(两次:-))。您的字符串中没有 1 、句号或 9 ,因此它与第一次不匹配。

此外,您不会在任何地方填充 $i 。$i 只是一个常规的标量变量,它不会神奇地填充任何东西。正则表达式 (/i) 末尾的 i 标志表示不区分大小写的搜索(如果您认为正在填充 $i

于 2013-04-11T08:46:53.293 回答
1

正则表达式语言嵌入在 Perl 中(反之亦然),但它不与 Perl 共享语法¹。这意味着重复或范围的其他语法。

1) 正则表达式与 Perl 字符串共享语法,虽然两者不完全兼容,但请参阅\b转义的不同含义。

字符类定义了一组多个属性。如果指定的属性之一匹配,则字符类将匹配。一个 charclass 可以包含:

  • 单个字符,例如[aeiou](匹配小写元音)
  • 范围,以匹配代码点的连续范围:([A-Z]大写拉丁字符)
  • 整个 charclass 的否定:([^']不是单引号的所有内容)
  • 命名字符类,如\d, \w(和 Unicode 属性很有趣)
  • (POSIX 字符类)

如果一个 charclass 多次包含一个字符,这无关紧要,因为它的行为就像一个集合并集。

字符类中的元字符是

  • ]: 比赛结束。要匹配方括号,必须使用[\[\]]or [][],因为 charclass不能为空。
  • ^仅在前导位置特殊的否定运算符:[~&|^]将匹配任何按位逻辑 Perl 运算符。
  • 范围运算符-。要匹配文字减号,可以将其放在 charclass 的末尾:该类[+-*]将是无效的(*在之前+,因此该类是空的,这是非法的),但[+*-]可以正常工作
  • 反斜杠仍然是转义字符。

字符类内部的空间很重要,即使在/x标志下也是如此。

在你的字符类上:

  • [1..9]也可以写成[19.], 并匹配1,9., 因为句点不是字符类中的元字符。
  • [1 .. 9]可以写[19. ],并且另外匹配一个空格。正如我上面所说,空格在字符类中很重要。

你可能的意思是:

如果您想匹配任何数字01to 9,您可以使用 range [0-9]。请记住,减号是字符类中的范围运算符。

于 2013-04-11T11:15:40.887 回答