正则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中返回小写的匹配版本。