正则expression式实现,以小写版本replace组

是否有任何正则expression式的实现,允许用正则expression式的小写版本replace正则expression式中的组?

在Perl中,你可以这样做:

$string =~ s/(some_regex)/lc($1)/ge; 

/e选项导致replaceexpression式被解释为要评估的Perl代码,其返回值被用作最终replace值。 lc($x)返回lc($x)的小写版本。 (不知道,但我认为在最近的Perl版本中, lc()将正确处理国际字符。)

/g表示全局匹配。 如果你只需要一个replace,省略g

如果您的正则expression式版本支持它,您可以使用\ L,就像在POSIX shell中一样:

 sed -r 's/(^.*)/\L\1/' 

如果您使用的是像SublimeText或TextMate 1这样的编辑器,那么您很可能会使用它

 \L$1 

作为您的替代品,其中$1是指您将括号括起来的正则expression式。 例如2 ,这里有一些我曾用来在某些SQL中压缩字段名的东西,在任何给定的行的结尾处将'as'的所有内容都放在右边。 首先“查找”正则expression式:

 (as|AS) ([A-Za-z_]+)\s*,$ 

然后replaceexpression式:

 $1 '\L$2', 

如果你使用Vim(或者大概是gvim),那么你会想用\L\1而不是\L$1 ,但是还有另外一个需要注意的问题:Vim颠倒了直接括起来的字符和转义括号字符。 所以要指定正则expression式的一部分包含在replace(“捕获”)中,您将在末尾使用\(在开头和\) 。 把\ as看作是一个特殊字符,而不是一个特殊字符,使它成为一个特殊字符的开始(如\s\w\b等等)。 所以,如果你不习惯它可能看起来很奇怪,但是如果你用Vim的方式来思考它,那实际上是完全合乎逻辑的。


1我已经在TextMate和SublimeText中testing了它,它的工作原理是这样,但有些编辑器使用\1而不是$1 。 试试两个,看看你的编辑器使用。

2我只是从我的历史中拉出了这个正则expression式。 我总是调整regexen而使用它们,我不能保证这是最终版本,所以我不build议它适合所描述的目的,特别是不使用SQL格式不同于我正在处理的SQL,只是它是正则expression式下降的具体示例。 因人而异。 UAYOR。

在Perl中,有

 $string =~ tr/[AZ]/[az]/; 

大多数正则expression式实现允许您在执行replace时传递callback函数,因此您可以简单地从callback中返回小写的匹配版本。