为什么补充搜索列表不起作用?

时间:2011-11-29 07:37:31

标签: perl

我希望"abc" =~ /\Aabc\z/gc;为假,因为/c就在那里,就像在这种情况下一样:

$pathname =˜ tr/a-zA-Z/_/cs; # change non-(ASCII)alphas to single underbar

但原来是true,任何人都可以解释原因吗?

3 个答案:

答案 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