58

是否有任何正则表达式的实现允许用它的小写版本替换正则表达式中的组?

4

6 回答 6

62

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

sed -r 's/(^.*)/\L\1/'
于 2009-05-15T19:45:10.337 回答
39

在 Perl 中,您可以执行以下操作:

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

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

/g表示全局匹配。g如果您只想要一个替换,请省略。

于 2009-01-09T11:08:12.180 回答
19

如果您使用的是 SublimeText 或 TextMate 1之类的编辑器,那么您很有可能会使用

\L$1

作为您的替代品, where$1指的是您将括号括起来的正则表达式中的某些内容。例如2,这是我用来在某些 SQL 中小写字段名称的东西,将所有内容都放在任何给定行末尾的“as”右侧。首先是“查找”正则表达式:

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

然后是替换表达式:

$1 '\L$2',

如果你使用 Vim(或者可能是 gvim),那么你会想要使用\L\1而不是\L$1,但是你需要注意另一个问题:Vim 颠倒了文字括号字符和转义括号字符之间的语法。因此,要指定要包含在替换中的正则表达式的一部分(“捕获”),您将\(在开头和\)结尾使用。将\其视为——而不是转义一个特殊字符以使其成为文字——标记一个特殊字符的开头(如\s, \w,\b等等)。所以如果你不习惯它可能看起来很奇怪,但如果你以 Vim 的方式思考它实际上是完全合乎逻辑的。


1我已经在 TextMate 和 SublimeText 中对此进行了测试,它按原样工作,但有些编辑器使用\1而不是$1. 尝试两者,看看你的编辑器使用哪个。

2我刚刚将此正则表达式从我的历史记录中删除。我总是在使用它们时调整正则表达式,我不能保证这是最终版本,所以我并不是说它适合所描述的目的,尤其是与我正在处理的 SQL 格式不同的 SQL,只是它正则表达式中小写的具体示例。YMMV。尤约尔。

于 2014-01-23T15:52:38.977 回答
13

几个答案已经注意到使用\L. 但是,\E如果您使用\L.

\L将所有内容转换为下一个\U\E小写。...\E关闭大小写转换。

(来源:https ://www.regular-expressions.info/replacecase.html )

因此,假设您想使用rename小写部分文件名,如下所示:

artist_-_album_-_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a
artist_-_album_-_Another_Song_Title_to_be_Lowercased_-_MultiCaseHash.m4a

您可以执行以下操作:

rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *
于 2018-03-22T23:55:48.777 回答
3

在 Perl 中有

$string =~ tr/[A-Z]/[a-z]/;
于 2009-01-09T10:47:05.233 回答
2

大多数 Regex 实现允许您在进行替换时传递回调函数,因此您可以简单地从回调中返回匹配的小写版本。

于 2009-01-09T10:50:39.190 回答