我正在尝试增加:
Text_1_string(0)
到
Text_1_string(1)
,依此类推。 请注意,我只想增加括号中的数字。 我用过:
name =~ s/\(([0-9]+)\)/$1 + 1/e;
但结果是:
Text_1_string1
我不明白为什么。捕获的组是数字,不应替换括号。
答案 0 :(得分:1)
它替换了匹配的整个模式,不仅捕获了所有模式。所以您确实需要放回括号
$name =~ s/\(([0-9]+)\)/'('.($1 + 1).')'/e;
由于替换部分被评估为 code ,因此它需要是正常的Perl代码,因此引号和串联以及括号都优先。
要添加,有一些模式不需要放回替换部分:lookahead and lookbehind断言。像普通锚一样,它们都是零宽度断言,因此它们不会消耗他们匹配的东西-您只能“看”
$name =~ s/(?<=\() ([0-9]+) (?=\))/$1 + 1/xe;
后面的外观不能是可变长度的(例如\w+
);它只需要固定的字符串模式。
(?<=...)
断言括号中的(固定长度)模式(不捕获!)必须在数字之前,而(?=...)
断言其括号内的模式必须遵循整个模式匹配。
lookbehind类型的构造\K
通常非常有用,它使引擎在字符串中保留与之匹配的内容(而不是“消耗”它);因此它“删除”了之前的匹配项,就像(?<=...)
形式
$name =~ s/\(\K ([0-9]+) (?=\))/$1 + 1/xe;
这也更有效。尽管在文档中也将其称为“后视”,但实际上在行为上存在明显的差异。请参阅this post和评论。感谢ikegami的评论。
所有这些都是正面环顾;还有消极的,断言给定的模式一定不是可以使整个事物匹配。
在这种情况下有点矫kill过正,但在其他一些情况下却是真正的礼物。