正则表达式实现用其小写版本替换组

时间:2009-01-09 10:43:30

标签: regex replace lowercase

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

6 个答案:

答案 0 :(得分:58)

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

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

答案 1 :(得分:34)

在Perl中,你可以这样做:

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

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

/g表示全球匹配。如果您只需要一次替换,请省略g

答案 2 :(得分:13)

如果您使用的是SublimeText或TextMate 1 等编辑器,则很有可能使用

\L$1

作为替代,其中$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 我刚把这个正则表达式从我的历史中删除了。我总是在使用它们时调整regexen,我不能保证这是最终版本,所以我并不是说它适合所描述的目的,特别是不能使用与我正在处理的SQL不同的SQL格式,只是它是正则表达式中下行的特定示例。因人而异。 UAYOR。

答案 3 :(得分:6)

Several answers have noted the use of \L. However, \E is also worth knowing about if you use \L.

\L converts everything up to the next \U or \E to lowercase. ... \E turns off case conversion.

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

So, suppose you wanted to use rename to lowercase part of some file names like this:

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

you could do something like:

rename -v 's/^(.*_-_)(.*)(_-_.*.m4a)/$1\L$2\E$3/g' *

答案 4 :(得分:3)

在Perl中,有

$string =~ tr/[A-Z]/[a-z]/;

答案 5 :(得分:2)

大多数Regex实现允许您在执行替换时传递回调函数,因此您只需从回调中返回匹配的小写版本。