2.22 把匹配上下文插入到替代文本中
问题描述
创建一个替代文本,用来把正则表达式匹配的文本替换为匹配之前的文本紧跟完整目标文本再紧跟匹配之后的文本。例如,如果在BeforeMatchAfter中找到的是Match,那么把这个匹配换成BeforeBeforeMatchAfterAfter,最终得到的新文本是BeforeBefore BeforeMatchAfterAfterAfter。
解决方案
$`$_$'
替代文本流派:.NET、Perl
\`\`\&\'\'
替代文本流派:Ruby
$`$`$&$'$'
替代文本流派:JavaScript
讨论
上下文(context)这个术语,指的是正则表达式所应用于的目标文本。总共存在3种上下文:正则匹配之前的目标文本、正则匹配之后的目标文本以及整个目标文本。在匹配之前的文本有时候被称作左上下文(left context),而匹配之后的文本则相应地被称作右上下文(right context)。整个目标文本则是左上下文、匹配再加右上下文。
.NET和Perl支持使用和«$_»来把所有3种形式的上下文插入到替代文本中。事实上,在Perl中每次成功的正则匹配之后都会赋值给这些变量,并且可以在任何代码中使用,直到遇到下一次匹配尝试。“美元符号+反引号”对应左上下文。在标准美式键盘上,你可以按键盘左上角1键左边的键来输入反引号。“美元符号+垂直引号”对应右上下文。垂直引号也就是通常的单引号。在标准美式键盘上,它位于分号和回车键(Enter)之间。“美元符号+下划线”是整个目标文本。与.NET和Perl类似,JavaScript也使用« $` »和« $' »来代表左、右上下文。然而,JavaScript并没有提供单个记号用于插入整个目标文本。你可以自己重构目标文本,把整个正则匹配通过« $& »添加到左、右上下文之间即可。
Ruby通过«`»和«'»支持左、右上下文,并且使用«&»来插入整个正则匹配。与JavaScript一样,Ruby中也不存在插入整个目标文本的记号。