我希望"abc" =~ /\Aabc\z/gc;
为假,因为/c
就在那里,就像在这种情况下一样:
$pathname =˜ tr/a-zA-Z/_/cs; # change non-(ASCII)alphas to single underbar
但原来是true
,任何人都可以解释原因吗?
答案 0 :(得分:8)
请参阅perlretut了解/c
实际执行的操作(应用于正则表达式匹配运算符,它不会像tr///
那样补充)。音译不是正则表达式,regexen不是音译。
来自perlretut:
匹配失败或更改目标字符串会重置位置。如果 你不希望在匹配失败后重置位置,添加// c ,如/ regexp / gc。
在perlrequick中几乎出现了相同的段落。
perlre让搜索变得有点困难,但这就是它所说的:
g和c 全局匹配,并在匹配失败后保持当前位置。 与i,m,s和x不同,这两个标志会影响正则表达式的使用方式 而不是正则表达本身。请参阅在Perl中使用正则表达式 perlretut进一步解释g和c修饰符。
答案 1 :(得分:6)
/c
不进行“补充”匹配:)
"abc" !~ /abc/; # false
要禁止
> 中的字符串中的abc
/((?!abc).)*\z/
但效率会低得多
编辑:
/gc
修饰符 :(来自perldoc perlretut
)匹配失败或更改目标字符串会重置位置。如果您不希望在匹配失败后重置位置,请添加
//c
,如/regexp/gc
中所示。字符串中的当前位置与字符串相关联,而不是正则表达式。这意味着不同的字符串具有不同的位置,并且可以独立设置或读取它们各自的位置。
答案 2 :(得分:2)
如果你想检查字符串中是否有东西,我推荐
$str !~ /abc/
是
的缩写!( $str =~ /abc/ )
您也可以使用以下内容,但它不必要地复杂(并且速度慢?):
$str =~ /^(?:(?!abc).)*\z/s