区别?和*在正则表达式中 - 匹配相同的输入?

Ash*_*win 1 regex perl

我无法理解之间的实际差别?,并*在正则表达式.我知道这?意味着要检查前一个字符/组是否存在0或1次,并且*意味着检查前一个字符/组是否存在0次或更多次.

但是这段代码

while(<>) {
  chomp($_);
  if(/hello?/) {
    print "metch $_ \n";
  }
  else {
    print "naot metch $_ \n";
  }
}
Run Code Online (Sandbox Code Playgroud)

给出了两个同出认沽hello?hello*.提供给此Perl程序的外部文件包含

hello
helloooo
hell
Run Code Online (Sandbox Code Playgroud)

输出是

metch hello 
metch helloooo 
metch hell 
Run Code Online (Sandbox Code Playgroud)

对于hello?hello*.我无法理解?和之间的确切区别*

use*_*740 10

在Perl中(与Java不同),默认情况下不会锚定m// -match运算符.

因此,它的所有输入都/hello?/与两者完全匹配/hello*/.也就是说,这些将匹配包含"地狱"的任何字符串(因为两个量词使"o"可选)在任何地方.

分别与/^hello?$/和比较/^hello*$/.由于这些使用锚,前者将不匹配"helloo"(最多允许一个"o"),而后者将.


Regexp Quote-like Operators下:

m/PATTERN/ 搜索字符串中的[任意位置]以进行模式匹配,并且在标量上下文中如果成功则返回true,如果失败则返回false.


Bor*_*din 5

令你困惑的是,没有类似的锚点^$正则表达式模式匹配只检查模式是否出现在目标字符串中的任何位置.

如果你添加了一些模式之后hello,像

if (/hello?, Ashwin/) { ... }
Run Code Online (Sandbox Code Playgroud)

然后是字符串

hello, Ashwin
Run Code Online (Sandbox Code Playgroud)

hell, Ashwin
Run Code Online (Sandbox Code Playgroud)

会匹配,但是

helloooo, Ashwin
Run Code Online (Sandbox Code Playgroud)

不会,因为逗号o之间有太多字符.hell,

但是,如果你使用星星*,就像

if (/hello*, Ashwin/) { ... }
Run Code Online (Sandbox Code Playgroud)

然后所有三个字符串都匹配.