我有以下文本
tooooooooooooon
根据我正在阅读的书籍,当“?”跟随在任何量词后面时,它会变成非贪婪模式。
我的正则表达式“to*?n”仍然返回“tooooooooooooon”。
它应该返回“ton”,不是吗?
你知道为什么吗?
我有以下文本
tooooooooooooon
正则表达式只能匹配实际存在的文本片段。
由于子字符串“ton”在您的字符串中不存在,因此不能作为匹配结果。匹配只会返回原始字符串的子串
编辑:明确一下,如果您使用以下带有额外“n”的字符串:
toooooooonoooooon
这个正则表达式(不指定'o')
t.*n
会匹配以下内容(在“n”之前尽可能多的字符)
toooooooonoooooon
但是正则表达式
t.*?n
只会匹配以下内容(在“n”之前尽可能少的字符)
toooooooon
正则表达式总是渴望匹配的。
你的表达式是这样的:
一个 't',后跟 *尽可能少的* 'o',再后面是一个 'n'。
这意味着任何必要的 o 都将被匹配,因为在结尾处有一个 'n',而表达式渴望到达该位置。匹配所有的 o 是它唯一成功的可能性。
$a = "toooooo";
$b = "toooooon";
if ($a =~ m/(to*?)/) {
print $1,"\n";
}
if ($b =~ m/(to*?n)/) {
print $1,"\n";
}
~>perl ex.pl
t
toooooon
'toooooo' ~~ /to*?n/
t o o o o o o
. . . .
. . . .
[t][o][o][o][o]{o} 匹配 [o] 5 次 [t][o][o][o][o][o]<n> 无法匹配 [n] -> 尝试匹配 [o] [t][o][o][o][o][o]{o} 匹配 [o] 6 次 [t][o][o][o][o][o][o]<n> 无法匹配 [n] -> 尝试匹配 [o] [t][o][o][o][o][o][o]<o> 无法匹配 [o] 7 次 -> 匹配失败
'toooooo' ~~ /to*n/
t o o o o o o {t} 匹配 [t] [t]{o}{o}{o}{o}{o}{o} 匹配 [o] 6 次 [t][o][o][o][o][o][o]<n> 无法匹配 [n] -> 尝试匹配 [o] [t][o][o][o][o][o] 匹配 [o] 5 次 [t][o][o][o][o][o]<n> 无法匹配 [n] -> 尝试匹配 [o]
. . . .
[t][o] 匹配 [o] 1 次 [t][o]<o> 无法匹配 [n] -> 尝试匹配 [o] [t] 匹配 [o] 0 次 [t]<n> 无法匹配 [n] -> 匹配失败
'toooooo' ~~ /to*+n/
t o o o o o o {t} 匹配 [t] [t]{o}{o}{o}{o}{o}{o} 匹配 [o] 6 次 [t][o][o][o][o][o][o]<n> 无法匹配 [n] -> 匹配失败